模块生命周期
概述
本文介绍了你的模块的生命周期以及如何创建可执行的类,将运行时初始化或卸载。初始化或卸载时,这些类可以执行数据库安装任务,升级任务、清理任务,等等。
由于主题组件和语言包一般不需要在数据库中添加表或数据,他们不需要担心初始化或卸载任务。
生命周期类规则
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提供 ModuleDataSetupInterface
和ModuleContextInterface
协助数据库操作如果安装/升级太复杂,可能会创建更多类来处理所有逻辑。在这些情况下,你可以通过, 你可以通过 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)
{
...
}
}