Magento 2 InstallSchema 方法未执行

Posted

技术标签:

【中文标题】Magento 2 InstallSchema 方法未执行【英文标题】:Magento 2 InstallSchema method not executed 【发布时间】:2018-12-28 16:21:39 【问题描述】:

在我自己的 Magento 2 自定义模块上,我想安装一个自定义数据库表。这是 InstallSchema 类代码:

<?php
namespace MyVendor\MyModule\Setup;

use Magento\Framework\Setup\InstallSchemaInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\SchemaSetupInterface;

class InstallSchema implements InstallSchemaInterface

    /**
     * @inheritdoc
     */
    public function install(SchemaSetupInterface $setup, ModuleContextInterface $context)
    
        $setup->startSetup();


            $table = $setup->getConnection()
                ->newTable($setup->getTable('my_table'))
                ->addColumn(
                    'greeting_id',
                    \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
                    null,
                    ['identity' => true, 'unsigned' => true, 'nullable' => false, 'primary' => true],
                    'Greeting ID'
                )
                ->addColumn(
                    'message',
                    \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
                    255,
                    ['nullable' => false, 'default' => ''],
                    'Message'
                )->setComment("Greeting Message table");

            $setup->getConnection()->createTable($table);

        $setup->endSetup();
    

但是安装方法没有被执行。

    在函数内部附加了一个带有断点的 xdebug 会话,从未调用过。

    删除 setup_module 数据库表中的模块行并重新运行bin/magento setup:upgrade

    设置开发者模式,禁用缓存,运行setup:di:compile,还是失败。

有什么想法吗? 我也尝试使用 UpdateSchema 更改模块版本,没有运气。

我在 Ubuntu Server 虚拟机上运行 Magento 2。文件夹权限设置正确。

【问题讨论】:

你启用你的模块了吗? bin/magento module:enable MyVendor_MyModule 从 'setup_module' 表中删除模块条目并从 config.php 文件中删除您的模块。再次尝试启用您的模块。安装模块时会创建magento 2表。 模块已启用。尝试删除config.php上的条目,删除数据库中的setup_module记录,然后setup:upgrade,没有任何效果。 也尝试创建一个新模块,同样的事情。我猜 InstallSchema 代码或者我的模块的文件夹结构有问题。 InstallSchema 文件位于 MyVendor/MyModule/Setup 文件夹下。 【参考方案1】:

请在 InstallSchema 文件中声明并添加依赖项,如下所示:-

namespace <Your_Package>\<Your_Module>\Setup;

use Magento\Framework\Setup\InstallSchemaInterface;
use Magento\Framework\Setup\SchemaSetupInterface;
use Magento\Framework\Setup\ModuleContextInterface;

然后清除缓存并从生成的文件夹中删除数据并从 setup_module 中删除模块条目。 确保您在 module.xml 文件中定义了正确的安装版本

【讨论】:

不走运,我已经在课堂上进行了正确的命名空间和使用。我删除了生成的文件夹内容并清除了缓存。同时删除数据库表中的模块行。什么都试过了。 你是否在module.xml中添加了安装版本 是的@Andrew 我已经添加了: (这是我可以在 setup_module 表上看到的正确版本)似乎由于某种原因从未调用过 install 方法。【参考方案2】:

找到了解决办法。它是 module.xml 文件中的模块名称。 setup:upgrade 安装程序在区分大小写的文件夹路径中搜索 InstallSchema,因此如果您将模块声明为

我的模块

它将搜索 MyVendor/my/module/Setup 文件夹。

我通过将名称替换为:

我的模块

因此安装程序将正确搜索 MyVendor/MyModule/Setup 文件夹。

通过将日志消息放在 Magento 安装文件夹的 Install.php 文件中,我发现了“旧方式”的问题。

【讨论】:

【参考方案3】:

@wildchild 很高兴让它与另一个解决方案一起工作。在您的问题中,您没有提到您使用的是 2.2.* 还是 2.3.*,您只是说 Magento 2.

从一台服务器移动到另一台服务器并从 2.2 升级到 2.3 后,我遇到了同样的问题,我的自定义模块停止工作,PHP 脚本没有在数据库中创建表。

后来我发现 Magento 改变了音乐,现在你必须使用 声明性架构 结构 Module_Vendor/Module_Name/etc/db_schema.xml 文件声明了模块的数据库结构。

请参阅下面的示例,您应该read more here

创建表格

以下示例创建具有四列的 declarative_table 表。 id_column 列是主键。

<schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:noNamespaceSchemaLocation="urn:magento:framework:Setup/Declaration/Schema/etc/schema.xsd">
    <table name="declarative_table">
        <column xsi:type="int" name="id_column" padding="10" unsigned="true" nullable="false" comment="Entity Id"/>
       <column xsi:type="int" name="severity" padding="10" unsigned="true" nullable="false" comment="Severity code"/>
        <column xsi:type="varchar" name="title" nullable="false" length="255" comment="Title"/>
       <column xsi:type="timestamp" name="time_occurred" padding="10" comment="Time of event"/>
       <constraint xsi:type="primary" referenceId="PRIMARY">
           <column name="id_column"/>
       </constraint>
   </table>
</schema>

然后运行这些命令// ubuntu

php bin/magento setup:upgrade && php bin/magento cache:flush && php bin/magento cache:clean

【讨论】:

【参考方案4】:

就我而言,package name 是错误的。用正确的包名称替换后,问题已修复。

namespace Package_Name\Module_Name\Setup;

【讨论】:

以上是关于Magento 2 InstallSchema 方法未执行的主要内容,如果未能解决你的问题,请参考以下文章

需要帮助返回 Magento 并在第 3 方支付网关后更新订单状态

为特定产品启用支付网关 - Magento 2

wordpress fishpig magento 安装 - getPostListHtml()

如何修改magento分类页面的产品的显示个数

Magento CE 1.8:Varnish 不会清除 URL

Kali安装magescan评估工具