Видалити модуль Magento 2


13

Мабуть, зараз Magento 2 підтримує сценарії видалення, що дозволяють модифікувати схему db під час видалення модуля (horay !!).
Як пояснено тут, це працює лише для модуля, встановленого через композитор.
(Я сподіваюся, що це спрацює в майбутньому для всіх модулів, але це вже інше питання).
Скажімо, у мене є модуль під назвою Testing_Demo.
Цей модуль робить 3 речі, які я хотів би видалити при видаленні.

  1. додає таблицю з назвою testing_demo. Тож мені потрібно її скинути.
  2. додає атрибут продукту, який називається demo. Тож це потрібно зняти
  3. має деякі налаштування, system->configurationякі можуть або не можуть зберігатися в таблиці core_config_data. Усі ці налаштування мають шлях testing_demo/.... Тому їх також потрібно видалити.

Як повинен виглядати скрипт для видалення модуля?


Я думаю, ваш сценарій деінсталяції повинен бути більше схожим на тест на інтеграцію, щоб побачити, чи видалення ваших розширень потягнеться за межі фронту або відносини схеми
Anton S

Я вам не можу суперечити. ти, мабуть, маєш рацію, але як це зробити? :)
Маріус

Я не маю уявлення про реактивний струм, але теоретично ви повинні знати, чи можна зібрати дані, які ви збираєте, чи ні, і тому процес видалення повинен бути покроковим керівництвом, яке доручає продавцеві перевірити, чи має наступний процес вплив на зобов'язання продавця в бухгалтерському обліку. , для клієнтів тощо. тож детально чисто технічну частину, ймовірно, легко перейти на макети та побачити, чи розширення посилається, розширюється, інші залежать і т. д. частини, які є рівномірними для всіх розширень, але бізнес-рішення позаду все ще вирішують продавцю, а ви можете лише вказуйте на конфлікти
Антон S

залежність повинна бути вирішена перед видаленням, тому це не моя проблема. Скажімо, я вирішив видалити розширення повністю, і від цього немає нічого.
Маріус

значить, вам просто потрібно звузити це до звичайних таблиць демпінгу та даних даних?
Anton S

Відповіді:


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().


Дякую за відповідь. Я перевірю і повернусь з результатом.
Маріус

@Marius ти не згадав, працює він чи ні. Крім того, я хотів би знати, чи буде цей сценарій видалення запускатися безпосередньо або він буде запущений, коли ми запустимо модуль: видалити
Аднан

1
@Adnan. Так. Це спрацювало. Сценарій викликається при виконанні команди консолі, видаліть модуль.
Маріус

@Marius, Якщо у вас є команда, що робити іншим розробникам? кожен з них локально повинен запускати команду? Чи є випадок запустити його автоматично при наступному потягу
sergio

[Виняток] Невизначена функціональність: методи з тим самим іменем, що і їх клас, не будуть конструкторами в майбутній версії PHP; У програмі Uninstall є застарілий інструктор інструментарію у ... / Setup / Uninstall .php на рядку 5
Піні
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.