> Magento2中文手册 > 模块生命周期

模块生命周期

概述

本文介绍了你的模块的生命周期以及如何创建可执行的类,将运行时初始化或卸载。初始化或卸载时,这些类可以执行数据库安装任务,升级任务、清理任务,等等。

由于主题组件和语言包一般不需要在数据库中添加表或数据,他们不需要担心初始化或卸载任务。

生命周期类规则

Magento 2不同的生命周期阶段遵循这些类的规则:

  • 类应位于模块的根目录的安装目录中,并具有相应的文件名。对于正确的文件名,请参见下面的具体例子。
  • 类必须使用它将在其中执行的阶段的特定名称。要确定正确的类名使用,请参阅下面的具体例子。
  • 类必须实现它将在其中执行的阶段的特定类接口。要确定正确的实现接口,请看下面的具体例子。

模块数据表结构初始化

模块数据表结构初始化是您的模块在安装、重新安装或升级时进行的第一个过程。

模块数据表创建

当您的模块最初安装时,您的模块所做的第一件事是通过执行安装类来执行数据表创建。

安装方法为InstallSchema 类实现\Magento\Framework\Setup\InstallSchemaInterface:

// 文件位置: <模块根目录>/Setup/InstallSchema.PHP

class \<Vendor>\<Module>\Setup\InstallSchema implements \Magento\Framework\Setup\InstallSchemaInterface
{
    /**
     * {@inheritdoc}
     */
    public function install(SchemaSetupInterface $setup, ModuleContextInterface $context)
    {
        ...
    }
}

数据表结果升级

如果你的模块已经安装了早期版本的,那么它将执行升级模式而安装。架构升级的目的通常是更新数据库结构或应用补丁。

升级方法为upgrade,UpgradeSchema 类实现 Magento\Framework\Setup\UpgradeSchemaInterface:

// 文件位置: <模块根目录>/Setup/UpgradeSchema.php

class \<Vendor>\<Module>\Setup\UpgradeSchema implements \Magento\Framework\Setup\UpgradeSchemaInterface
{
    /**
     * {@inheritdoc}
     */
    public function upgrade(SchemaSetupInterface $setup, ModuleContextInterface $context)
    {
        ...
    }
}

修复更改数据表结构事件

您可以在模块中创建一个类,该类将在数据表结构安装或升级后运行。通常是为了做最后的修改数据表结构。

执行方法为install,类 Recurring 实现\Magento\Framework\Setup\InstallSchemaInterface:

// 文件位置: <模块根目录>/Setup/Recurring.php

class \<Vendor>\<Module>\Setup\Recurring implements \Magento\Framework\Setup\InstallSchemaInterface
{
    /**
     * {@inheritdoc}
     */
    public function install(SchemaSetupInterface $setup, ModuleContextInterface $context)
    {
        ...
    }
}

数据初始化

数据库结果执行完成后,执行数据初始化。

数据初始化

执行方法install 执行类 InstallData 实现 Magento\Framework\Setup\InstallDataInterface:

// 文件位置: <模块根目录>/Setup/InstallData.php

class \<Vendor>\<Module>\Setup\InstallData implements \Magento\Framework\Setup\InstallDataInterface
{
    /**
     * {@inheritdoc}
     */
    public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
    {
        ...
    }
}

数据升级

执行方法 upgrade 执行类UpgradeData 实现Magento\Framework\Setup\UpgradeDataInterface:

//<模块根目录>/Setup/UpgradeData.php

class \<Vendor>\<Module>\Setup\UpgradeData implements \Magento\Framework\Setup\UpgradeDataInterface
{
    /**
     * {@inheritdoc}
     */
    public function upgrade(ModuleDataSetupInterface $setup, ModuleContextInterface $context);
    {
        ...
    }
}

修复数据事件

执行方法 install 执行类 RecurringData 实现Magento\Framework\Setup\InstallDataInterface:

// 文件位置: <模块根目录>/Setup/RecurringData.php

class \<Vendor>\<Module>\Setup\RecurringData implements \Magento\Framework\Setup\InstallDataInterface
{
    /**
     * {@inheritdoc}
     */
    public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
    {
        ...
    }
}

建立资源模型

Magento提供 ModuleDataSetupInterfaceModuleContextInterface 协助数据库操作如果安装/升级太复杂,可能会创建更多类来处理所有逻辑。在这些情况下,你可以通过, 你可以通过 ModuleDataSetupInterface 接口,实现数据库操作类。.

class InstallData implements InstallDataInterface
{
    /**
     * @var CustomerFactory
     */
    private $customerSetupFactory;

    /**
     * @param CustomerFactory $customerSetupFactory
     */
    public function __construct(CustomerFactory $customerSetupFactory)
    {
        $this->customerSetupFactory = $customerSetupFactory;
    }

    /**
     * {@inheritdoc}
     */
    public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
    {
        /** @var Customer $customerSetup */
        $customerSetup = $this->customerSetupFactory->create(['setup' => $setup]);

        $setup->startSetup();
        $customerSetup->installEntities();
        ...
    }
}

Module context

添加更多的逻辑,你的安装/升级类,你可以使用 ModuleContextInterface 。上下文提供模块信息,如当前模块版本,以帮助将逻辑添加到类中。

class \Magento\Cms\Setup\InstallData implements \Magento\Framework\Setup\UpgradeDataInterface
{
   public function upgrade(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
   {
        if (version_compare($context->getVersion(), '1.0.0', '<')) {
            ...
        }
   }
}

卸载事件

// 文件位置: <模块根目录>/Setup/Uninstall.php

class \<Vendor>\<Module>\Setup\Uninstall implements \Magento\Framework\Setup\UninstallInterface
{
    /**
     * {@inheritdoc}
     */
    public function uninstall(SchemaSetupInterface $setup, ModuleContextInterface $context)
    {
        ...
    }
}