Обрабатывает ли шаблон UpgradeSchema Magento 2 несмежные переходы версий
Magento 2 заменил сценарии обновления установки Magento 1 командой bin/magento setup:upgrade
.
Когда модуль установлен, эта команда ищет класс InstallSchema
и InstallData
в папке модуля Setup
и запускает метод install
обоих классов.
При обновлении модуля эта команда ищет класс UpgradeSchema
и UpgradeData
в папке модуля Setup
и запускает метод upgrade
этого класса. В отличие от Magento 1, больше нет встроенной логики для выполнения набора сценарии, названные номерами версий.
Шаблон, используемый ядром Magento 2 в сценариях обновления, выглядит следующим образом
public function upgrade(SchemaSetupInterface $setup, ModuleContextInterface $context)
{
$installer = $setup;
$connection = $installer->getConnection();
if (version_compare($context->getVersion(), '2.0.1') < 0) {
//... upgrade scripts here ...
}
if (version_compare($context->getVersion(), '2.0.2') < 0) {
//... upgrade scripts here ...
}
if (version_compare($context->getVersion(), '2.0.3') < 0) {
//... upgrade scripts here ...
}
if (version_compare($context->getVersion(), '2.0.4') < 0) {
//... upgrade scripts here ...
}
}
Т.е. Классы обновления должны включать программную логику для проверки версий.
Хотя, глядя на то, как Magento закодировал их в ядре, не ясно, как работает эта система. Является ли $context->getVersion()
версией модуля am, с которой пользователь выполняет обновление? Или чтобы? Если вы перепрыгиваете версии модулей (скажем, с 2.0.2
на 2.0.5
), вызывает ли setup:upgrade
это upgrade
один раз или он проходит через сценарии несколько раз (один для обновления 2.0.3
, снова для обновления 2.0.4
и снова для 2.0.5
?
Это (похоже) не задокументировано на сайте dev docs - и код установки довольно сложно проверить методом проб и ошибок. Кто-нибудь знает, как это работает, и безопасна ли реализация Magento "непрерывное обновление версии"? Если у вас возникнет соблазн ответить , конечно на более позднее без тестирования - добро пожаловать, новичок!
1 answers
Вот шаги по обновлению, как я их понимаю:
- Для всех активных модулей
$ bin/magento setup:upgrade
проверяет настроенный (module.xml
файл) версия по сравнению с базой данных ( setup_module таблица) схема+ значения данных [1] - Различия между настроенной версией и версией базы данных запускают выполнение
UpgradeSchema->upgrade()
, а затемUpgradeData->upgrade()
для каждого модуля по одному разу каждый [2] -
$context->getVersion()
возвращает соответствующее значение базы данных для этого модуля из setup_module таблица, которая используется в условном состоянии
[1] Как и в случае с Magento 1, setup_module.schema_version
и setup_module.data_version
значения будут (должны) всегда быть равными; неравные значения указывают на неудачный процесс обновления.
Кстати, спасибо, что напомнили мне получить ответ о том, почему мы изменили подход. (Я думаю, что когда-то был, но я забыл.) Я также позабочусь о том, чтобы все это было более тщательно задокументировано, в том числе...
[2] ...в имейте в виду, что каждый upgrade()
выполняется только один раз с соответствующим значением из базы данных, что означает, что вся логика обновления обрабатывается последовательно для каждого модуля , что необходимо учитывать, если модуль зависит от схемы или данных какого-либо другого модуля, находящихся в определенном состоянии.