Módulo de desinstalación de Magento 2

13

Aparentemente, ahora Magento 2 admite scripts de desinstalación que permiten la modificación del esquema db al desinstalar un módulo (¡horay!).
Como se explica aquí, esto solo funciona para el módulo instalado a través del compositor.
(Espero que funcione en el futuro para todos los módulos, pero ese es un problema diferente).
Digamos que tengo un módulo llamado Testing_Demo.
Este módulo hace 3 cosas que me gustaría eliminar al desinstalarlo.

  1. agrega una tabla llamada testing_demo. Entonces necesito dejarlo caer.
  2. agrega un atributo de producto llamado demo. Entonces esto necesita ser eliminado
  3. tiene algunas configuraciones system->configurationque podrían o no estar almacenadas en la tabla core_config_data. Todos estos ajustes tienen la ruta testing_demo/.... Por lo tanto, estos también deben eliminarse.

¿Cómo debería ser el script de desinstalación de mi módulo?

Marius
fuente
Supongo que su secuencia de comandos de desinstalación debería ser más como una prueba de integración para ver si la eliminación de sus extensiones afectará la interfaz o las relaciones de esquema
Anton S
No te puedo contradecir allí. probablemente tengas razón, pero ¿cómo hago eso? :)
Marius
No tengo idea del jet, pero en teoría debería saber si los datos que recopila pueden descartarse o no y, por lo tanto, el proceso de desinstalación debe ser una guía paso a paso que instruya a un comerciante a verificar si el siguiente proceso tiene efectos sobre las responsabilidades del comerciante en la contabilidad , en clientes, etc. por lo que la parte que es puramente técnica probablemente sea fácil de recorrer diseños y ver si su extensión está referenciada, extendida, otras dependen, etc. partes que son uniformes para todas las extensiones, pero las decisiones comerciales detrás aún dependen del comerciante para decidir y usted solo puede señalar conflictos
Anton S
la dependencia debe manejarse antes de la desinstalación, así que este no es mi problema. Digamos que decidí eliminar la extensión por completo, y no hay nada que dependa de ello.
Marius
entonces, ¿solo necesita reducir esto a tablas de volcado simples y lado de datos?
Anton S

Respuestas:

18

Buscando en la base de código para UninstallInterfacedar \Magento\Setup\Model\UninstallCollector.

Si busca UninstallCollectorentonces, encontrará que se usa en \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>");
        }
    }

En conjunto, podemos suponer:

  1. Su módulo debe contener una Uninstallclase en {module}\Setup\Uninstall.php.
  2. Esta clase debería implementarse Magento\Framework\Setup\UninstallInterface.
  3. Esta clase debe tener un uninstallmétodo que contenga cualquier lógica necesaria.
  4. Los mismos objetos y métodos están disponibles para usted como en cualquier script de configuración o actualización.

Entonces, aquí está tu 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();
    }
}

Elimine las tablas, columnas o datos utilizando los métodos adecuados. Ver \Magento\Framework\DB\Adapter\AdapterInterface, disponible como $setup->getConnection().

Ryan Hoerr
fuente
Gracias por la respuesta. Probaré y volveré con un resultado.
Marius
@ Mario no mencionaste si te funciona o no. Además, me gustaría saber si este script de desinstalación se ejecuta directamente o se activará cuando ejecutamos el módulo: desinstalar
Adnan
1
@Adnan. Si. Funcionó. Se llama al script cuando se ejecuta el comando de la consola. Desinstale el módulo.
Marius
@ Mario, en caso de tener un equipo, ¿qué deberían hacer otros desarrolladores? cada uno de ellos localmente debe ejecutar el comando? ¿Hay algún caso para ejecutarlo automáticamente con el próximo tirón?
sergio
[Excepción] Funcionalidad obsoleta: los métodos con el mismo nombre que su clase no serán constructores en una versión futura de PHP; La desinstalación tiene un constructor obsoleto en ... / Configuración / Desinstalar .php en la línea 5
Pini