- Magento 2 Developer's Guide
- Branko Ajzele
- 472字
- 2021-07-30 09:53:24
Understanding the flow of schema and data scripts
Simply put, the role of the schema scripts is to create a database structure supporting your module logic. For example, creating a table where our entities would persist their data. The role of the data scripts is to manage the data within existing tables, usually in the form of adding some sample data during module installation.
If we look a few steps back, we can notice how schema_version
and data_version
from the database match the setup_version
number from our module.xml
file. They all imply the same thing. If we were to now change the setup_version
number in our module.xml
file and run the php bin/magento setup:upgrade
console command again, our database schema_version
and data_version
would get updated to this new version number.
This is done through module's install
and upgrade
scripts. If we take a quick look at the setup/src/Magento/Setup/Model/Installer.php
file, we can see a function, getSchemaDataHandler
, with content as follows:
private function getSchemaDataHandler($moduleName, $type) { $className = str_replace('_', '\\', $moduleName) . '\Setup'; switch ($type) { case 'schema-install': $className .= '\InstallSchema'; $interface = self::SCHEMA_INSTALL; break; case 'schema-upgrade': $className .= '\UpgradeSchema'; $interface = self::SCHEMA_UPGRADE; break; case 'schema-recurring': $className .= '\Recurring'; $interface = self::SCHEMA_INSTALL; break; case 'data-install': $className .= '\InstallData'; $interface = self::DATA_INSTALL; break; case 'data-upgrade': $className .= '\UpgradeData'; $interface = self::DATA_UPGRADE; break; default: throw new \Magento\Setup\Exception("$className does not exist"); } return $this->createSchemaDataHandler($className, $interface); }
This is what tells Magento which classes to pick up and run from the individual module Setup
directory. We will ignore the Recurring case for the moment, as only the Magento_Indexer
module uses it.
For the first time, we run php bin/magento setup:upgrade
against our module; while it still has no entries under the setup_module
table, Magento will execute the files within the module Setup
folder in following order:
InstallSchema.php
UpgradeSchema.php
InstallData.php
UpgradeData.php
Notice that this is the same order, top to bottom, as in the getSchemaDataHandler
method.
Every subsequent upper module version number change, followed by the console php bin/magento setup:upgrade
command, would result in the following files being run in the order as listed:
UpgradeSchema.php
UpgradeData.php
Additionally, Magento would record the upped version number under the setup_module
database. Magento will only trigger install or upgrade scripts when the version number in the database is less than the version number in the module.xml
file.
Tip
We are not required to always provide these install or upgrade scripts, if ever. They are only needed when we need to add or edit existing tables or entries in a database.
If we look carefully at the implementation of the install
and update
methods within the appropriate scripts, we can see they both accept ModuleContextInterface $context
as a second parameter. Since upgrade scripts are the ones triggering on every upped version number, we can use $context->getVersion()
to target changes specific to the module version.
- JavaScript 從入門到項目實踐(超值版)
- Microsoft Application Virtualization Cookbook
- Building a RESTful Web Service with Spring
- Flash CS6中文版應用教程(第三版)
- Banana Pi Cookbook
- Yocto for Raspberry Pi
- 青少年Python編程入門
- Hands-On Reinforcement Learning with Python
- NoSQL數據庫原理
- HTML+CSS+JavaScript網頁設計從入門到精通 (清華社"視頻大講堂"大系·網絡開發(fā)視頻大講堂)
- Geospatial Development By Example with Python
- 大話Java:程序設計從入門到精通
- 汽車人機交互界面整合設計
- Get Your Hands Dirty on Clean Architecture
- 算法訓練營:海量圖解+競賽刷題(入門篇)