Modulo di disinstallazione di Magento 2


13

Apparentemente, ora Magento 2 supporta gli script di disinstallazione che consentono la modifica dello schema db durante la disinstallazione di un modulo (horay !!).
Come spiegato qui, questo funziona solo per il modulo installato tramite compositore.
(Spero che funzionerà in futuro per tutti i moduli, ma questo è un problema diverso).
Diciamo che ho un modulo chiamato Testing_Demo.
Questo modulo fa 3 cose che vorrei rimuovere durante la disinstallazione.

  1. aggiunge una tabella chiamata testing_demo. Quindi devo lasciarlo cadere.
  2. aggiunge un attributo del prodotto chiamato demo. Quindi questo deve essere rimosso
  3. ha alcune impostazioni system->configurationche potrebbero essere o non essere memorizzate nella tabella core_config_data. Tutte queste impostazioni hanno il percorso testing_demo/.... Quindi anche questi devono essere rimossi.

Come dovrebbe essere il mio script di disinstallazione del modulo?


Immagino che il tuo script di disinstallazione dovrebbe essere più simile a un test di integrazione per vedere se la rimozione delle tue estensioni consentirà il frontend o le relazioni dello schema
Anton S

Non posso contraddirti lì. probabilmente hai ragione, ma come posso farlo? :)
Marius

Non ne ho idea, ma in teoria dovresti sapere se i dati raccolti possono essere eliminati o meno e quindi il processo di disinstallazione dovrebbe essere una guida passo passo che istruisce un commerciante a verificare se il seguente processo ha effetti sulle passività del commerciante sulla contabilità , su clienti ecc. quindi la parte che è puramente tecnica è probabilmente facile da attraversare i layout e vedere se la tua estensione è referenziata, estesa, altre dipendono ecc. parti che sono uniformi a tutte le estensioni ma le decisioni commerciali dietro sono ancora a carico del commerciante per decidere e puoi solo segnalare conflitti
Anton S

la dipendenza dovrebbe essere gestita prima della disinstallazione, quindi questo non è un mio problema. Diciamo che ho deciso di rimuovere completamente l'estensione e non c'è nulla a seconda di esso.
Marius

quindi hai solo bisogno di restringerlo a semplici tabelle di dumping e dati lato delle cose?
Anton S

Risposte:


18

Ricerca nella base di codice per UninstallInterface\Magento\Setup\Model\UninstallCollector.

Se cerchi UninstallCollectorallora, troverai che è usato in \Magento\Setup\Console\Command\ModuleUninstallCommand. Particolarmente rilevante:

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

Metti insieme, possiamo supporre:

  1. Il tuo modulo dovrebbe contenere una Uninstallclasse in {module}\Setup\Uninstall.php.
  2. Questa classe dovrebbe implementare Magento\Framework\Setup\UninstallInterface.
  3. Questa classe dovrebbe avere un uninstallmetodo contenente qualsiasi logica necessaria.
  4. Sono disponibili gli stessi oggetti e metodi di qualsiasi script di installazione o aggiornamento.

Quindi, ecco il tuo scheletro:

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

Rimuovere eventuali tabelle, colonne o dati utilizzando i metodi appropriati. Vedi \Magento\Framework\DB\Adapter\AdapterInterface, disponibile come $setup->getConnection().


Grazie per la risposta. Proverò e tornerò con un risultato.
Marius

@Marius non hai detto se funziona o no per te. Inoltre, vorrei sapere se questo script di disinstallazione viene eseguito direttamente o verrà attivato quando eseguiamo il modulo: disinstallazione
Adnan

1
@Adnan. Sì. Ha funzionato. Lo script viene chiamato quando si esegue il comando console per disinstallare il modulo.
Marius

@Marius, nel caso tu abbia una squadra, cosa dovrebbero fare gli altri sviluppatori? ognuno di essi localmente dovrebbe eseguire il comando? È possibile eseguirlo automaticamente con il prossimo pull?
sergio,

[Eccezione] Funzionalità obsoleta: i metodi con lo stesso nome della loro classe non saranno costruttori in una versione futura di PHP; Disinstalla ha un componente obsoleto in ... / Setup / Disinstalla .php sulla linea 5
Pini
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.