Обрабатывает ли шаблон 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 "непрерывное обновление версии"? Если у вас возникнет соблазн ответить , конечно на более позднее без тестирования - добро пожаловать, новичок!

Author: Alan Storm, 2017-02-22

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() выполняется только один раз с соответствующим значением из базы данных, что означает, что вся логика обновления обрабатывается последовательно для каждого модуля , что необходимо учитывать, если модуль зависит от схемы или данных какого-либо другого модуля, находящихся в определенном состоянии.

 10
Author: benmarks, 2017-02-23 01:06:49