Модуль удаления Magento 2

13

По-видимому, теперь Magento 2 поддерживает сценарии удаления, которые позволяют изменять схему БД при удалении модуля (horay !!).
Как объясняется здесь, это работает только для модуля, установленного через композитор.
(Я надеюсь, что это будет работать в будущем для всех модулей, но это другая проблема).
Допустим, у меня есть модуль под названием Testing_Demo.
Этот модуль делает 3 вещи, которые я хотел бы удалить при удалении.

  1. добавляет таблицу с именем testing_demo. Поэтому мне нужно бросить это.
  2. добавляет атрибут продукта с именем demo. Так что это должно быть удалено
  3. имеет некоторые настройки, system->configurationкоторые могут или не могут быть сохранены в таблице core_config_data. Все эти настройки имеют путь testing_demo/.... Таким образом, они также должны быть удалены.

Как должен выглядеть скрипт удаления модуля?

Мариус
источник
Я полагаю, что ваш скрипт удаления должен больше походить на интеграционный тест, чтобы увидеть, будет ли удаление ваших расширений улучшать внешний интерфейс или отношения схемы
Антон С.
Я не могу противоречить вам там. ты наверное прав, но как мне это сделать? :)
Мариус
Я понятия не имею, но теоретически вы должны знать, можно ли отбрасывать собираемые вами данные или нет, и поэтому процесс удаления должен быть пошаговым руководством, которое инструктирует продавца проверить, влияет ли следующий процесс на обязательства продавца по учету на клиентов и т. д. так что чисто техническая часть, вероятно, легко просматривается в макетах, и можно увидеть, ссылаются ли на ваше расширение, расширены ли другие, зависят ли и т. д. части, которые являются едиными для всех расширений, но за бизнес-решениями по-прежнему остается решать торговец, и вы можете только указывают на конфликты
Антон С
зависимость должна быть обработана перед удалением, так что это не моя проблема. Допустим, я решил полностью удалить расширение, и от него ничего не зависит.
Мариус
так что вам просто нужно сузить это до простых дамп-таблиц и данных?
Антон С

Ответы:

18

Поиск кодовой базы для UninstallInterfaceтрюков \Magento\Setup\Model\UninstallCollector.

Если вы ищете UninstallCollector, вы найдете, что используется в \Magento\Setup\Console\Command\ModuleUninstallCommand. Особенно актуально:

    $uninstalls = $this->collector->collectUninstall();
    $setupModel = $this->objectManager->get('Magento\Setup\Module\Setup');
    foreach ($modules as $module) {
        if (isset($uninstalls[$module])) {
            $output->writeln("<info>Removing data of $module</info>");
            $uninstalls[$module]->uninstall(
                $setupModel,
                new ModuleContext($this->moduleResource->getDbVersion($module) ?: '')
            );
        } else {
            $output->writeln("<info>No data to clear in $module</info>");
        }
    }

Вместе мы можем предположить:

  1. Ваш модуль должен содержать Uninstallкласс в {module}\Setup\Uninstall.php.
  2. Этот класс должен реализовать Magento\Framework\Setup\UninstallInterface.
  3. Этот класс должен иметь uninstallметод, содержащий любую необходимую логику.
  4. Вам доступны те же объекты и методы, что и в любом скрипте установки или обновления.

Итак, вот ваш скелет:

<?php

namespace \Custom\Module\Setup;

class Uninstall implements \Magento\Framework\Setup\UninstallInterface
{
    /**
     * Module uninstall code
     *
     * @param \Magento\Framework\Setup\SchemaSetupInterface $setup
     * @param \Magento\Framework\Setup\ModuleContextInterface $context
     * @return void
     */
    public function uninstall(
        \Magento\Framework\Setup\SchemaSetupInterface $setup,
        \Magento\Framework\Setup\ModuleContextInterface $context
    ) {
        $setup->startSetup();

        // Uninstall logic here

        $setup->endSetup();
    }
}

Удалите все таблицы, столбцы или данные, используя соответствующие методы. Смотрите \Magento\Framework\DB\Adapter\AdapterInterface, доступно как $setup->getConnection().

Райан Херр
источник
Спасибо за ответ. Я проверю и вернусь с результатом.
Мариус
@ Мариус, ты не упомянул, работает ли он на тебя или нет. Кроме того, я хотел бы знать, будет ли этот скрипт деинсталляции выполняться напрямую или он будет запущен при запуске модуля:
Adnan
1
@Adnan. Да. Это сработало. Сценарий вызывается при запуске консольной команды, деинсталлируйте модуль.
Мариус
@Marius, если у тебя есть команда, что должны делать другие разработчики? каждый из них локально должен запустить команду? В любом случае, чтобы запустить его автоматически при следующем нажатии?
Серхио
[Исключение] Устаревшая функциональность: методы с тем же именем, что и их класс, не будут конструкторами в будущей версии PHP; У деинсталлятора есть устаревший конструктор в ... / Setup / Uninstall .php в строке 5
Pini