Módulo de desinstalação do Magento 2

13

Aparentemente, agora o Magento 2 suporta scripts de desinstalação que permitem a modificação do esquema db ao desinstalar um módulo (horay !!).
Conforme explicado aqui, isso funciona apenas para o módulo instalado via compositor.
(Espero que funcione no futuro para todos os módulos, mas essa é uma questão diferente).
Digamos que eu tenho um módulo chamado Testing_Demo.
Este módulo faz três coisas que eu gostaria de remover ao desinstalá-lo.

  1. adiciona uma tabela chamada testing_demo. Então eu preciso largar isso.
  2. adiciona um atributo de produto chamado demo. Portanto, isso precisa ser removido
  3. possui algumas configurações system->configurationque podem ou não ser armazenadas na tabela core_config_data. Todas essas configurações têm o caminho testing_demo/.... Portanto, esses precisam ser removidos também.

Como deve ser o script de desinstalação do meu módulo?

Marius
fonte
Eu acho que o seu script de desinstalação deve ser mais como um teste de integração para ver se a remoção de suas extensões vai f o frontend ou as relações de esquema
Anton S
Eu não posso te contradizer lá. você provavelmente está certo, mas como faço isso? :)
Marius
Eu não tenho idéia do jato, mas, em teoria, você deve saber se os dados coletados podem ser descartados ou não e, portanto, o processo de desinstalação deve ser um guia passo a passo que instrui um comerciante a verificar se o processo a seguir afeta os passivos dos comerciantes na contabilidade , em clientes etc. portanto, a parte que é puramente técnica provavelmente é fácil de percorrer layouts e ver se sua extensão é referenciada, estendida, outras estão dependendo etc. partes uniformes para todas as extensões, mas as decisões de negócios por trás ainda dependem do comerciante decidir e você pode apenas apontar conflitos
Anton S
a dependência deve ser tratada antes da desinstalação, para que este não seja o meu problema. Digamos que eu decidi remover a extensão completamente, e não há nada dependendo dela.
Marius
então você só precisa restringir isso a tabelas de dumping simples e dados de coisas?
Anton S

Respostas:

18

Pesquisando na base de código para UninstallInterface\Magento\Setup\Model\UninstallCollector.

Se você procurar por UninstallCollectorisso, verá que é usado no \Magento\Setup\Console\Command\ModuleUninstallCommand. Particularmente relevante:

    $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>");
        }
    }

Juntos, podemos supor:

  1. Seu módulo deve conter uma Uninstallclasse em {module}\Setup\Uninstall.php.
  2. Esta classe deve implementar Magento\Framework\Setup\UninstallInterface.
  3. Essa classe deve ter um uninstallmétodo que contenha qualquer lógica necessária.
  4. Os mesmos objetos e métodos estão disponíveis para você como em qualquer script de instalação ou atualização.

Então, aqui está o seu esqueleto:

<?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();
    }
}

Remova quaisquer tabelas, colunas ou dados usando os métodos apropriados. Veja \Magento\Framework\DB\Adapter\AdapterInterface, disponível como $setup->getConnection().

Ryan Hoerr
fonte
Obrigado pela resposta. Vou testar e voltar com um resultado.
Marius
@ Marius, você não mencionou se está funcionando para você ou não. Além disso, gostaria de conhecer a vontade deste script de desinstalação é executado diretamente ou será acionado quando corremos módulo: desinstalação
Adnan
1
@Adnan. Sim. Funcionou. O script é chamado ao executar o comando do console, desinstale o módulo.
Marius
@ Marius, caso você tenha uma equipe, o que os outros desenvolvedores devem fazer? cada um deles localmente deve executar o comando? Existe algum caso para executá-lo automaticamente com o próximo pull?
sergio
[Exceção] Funcionalidade preterida: Métodos com o mesmo nome de sua classe não serão construtores em uma versão futura do PHP; Desinstalar possui um construtor obsoleto em ... / Configurar / Desinstalar .php na linha 5
Pini