마 젠토 2 제거 모듈 설치된 모듈에서만 작동합니다. (향후

분명히 Magento 2는 모듈을 제거 할 때 db 스키마 수정을 허용하는 제거 스크립트를 지원합니다 (horay !!).
여기에 설명 된대로 이것은 composer를 통해 설치된 모듈에서만 작동합니다.
(향후 모든 모듈에서 작동하기를 희망하지만 다른 문제입니다).
이라는 모듈이 있다고 가정 해 봅시다 Testing_Demo.
이 모듈은 제거 할 때 제거하고 싶은 3 가지 작업을 수행합니다.

  1. 라는 테이블을 추가합니다 testing_demo. 그래서 떨어 뜨려야합니다.
  2. 이라는 제품 속성을 추가합니다 demo. 따라서 제거해야합니다
  3. system->configuration테이블에 저장되거나 저장되지 않을 수있는 설정 이 있습니다 core_config_data. 이 모든 설정에는 경로가 testing_demo/...있습니다. 따라서 이것도 제거해야합니다.

모듈 제거 스크립트는 어떻게 생겼습니까?



답변

코드베이스를 검색하면 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().