Magento 2 Deinstallationsmodul

13

Anscheinend unterstützt Magento 2 jetzt Deinstallationsskripte, die eine Änderung des DB-Schemas beim Deinstallieren eines Moduls ermöglichen (horay !!).
Wie hier erklärt, funktioniert dies nur für Module, die über Composer installiert wurden.
(Ich hoffe, es wird in Zukunft für alle Module funktionieren, aber das ist ein anderes Thema).
Nehmen wir an, ich habe ein Modul namens Testing_Demo.
Dieses Modul macht 3 Dinge, die ich bei der Deinstallation entfernen möchte.

  1. fügt eine Tabelle mit dem Namen hinzu testing_demo. Also muss ich es fallen lassen.
  2. Fügt ein Produktattribut namens hinzu demo. Das muss also entfernt werden
  3. enthält einige Einstellungen system->configuration, die möglicherweise in der Tabelle gespeichert sind oder nicht core_config_data. Alle diese Einstellungen haben den Pfad testing_demo/.... Also müssen diese auch entfernt werden.

Wie soll mein Modul-Deinstallationsskript aussehen?

Marius
quelle
Ich denke, Ihr Deinstallationsskript sollte eher einem Integrationstest ähneln, um festzustellen, ob das Entfernen Ihrer Erweiterungen das Frontend oder die Schemabeziehungen verbessern wird
Anton S
Da kann ich dir nicht widersprechen. Sie haben wahrscheinlich recht, aber wie mache ich das? :)
Marius
Ich habe keine Ahnung, aber theoretisch sollten Sie wissen, ob die von Ihnen gesammelten Daten gelöscht werden können oder nicht, und daher sollte der Deinstallationsprozess eine schrittweise Anleitung sein, die einen Händler anweist, zu überprüfen, ob der folgende Prozess Auswirkungen auf die Verbindlichkeiten des Händlers im Rechnungswesen hat , auf Kunden etc. Daher ist es wahrscheinlich einfach, das rein technische Teil durch Layouts zu ziehen und festzustellen, ob Ihre Erweiterung referenziert oder erweitert ist. Andere Teile hängen von usw. ab, die für alle Erweiterungen einheitlich sind auf Konflikte hinweisen
Anton S
Die Abhängigkeit sollte vor der Deinstallation behandelt werden, damit dies nicht mein Problem ist. Angenommen, ich habe beschlossen, die Erweiterung vollständig zu entfernen, und es hängt nichts davon ab.
Marius
Sie müssen dies also nur auf einfache Dumping-Tabellen und Datenseiten eingrenzen?
Anton S

Antworten:

18

Durchsuchen der Codebasis nach UninstallInterfacegives \Magento\Setup\Model\UninstallCollector.

Wenn Sie dann suchen UninstallCollector, werden Sie feststellen, dass es in verwendet wird \Magento\Setup\Console\Command\ModuleUninstallCommand. Insbesondere relevant:

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

Zusammengenommen können wir vermuten:

  1. Ihr Modul sollte eine UninstallKlasse bei enthalten {module}\Setup\Uninstall.php.
  2. Diese Klasse sollte implementieren Magento\Framework\Setup\UninstallInterface.
  3. Diese Klasse soll eine hat uninstallMethode enthält alle notwendige Logik.
  4. Es stehen Ihnen dieselben Objekte und Methoden zur Verfügung wie in jedem Setup- oder Upgrade-Skript.

Also, hier ist dein Skelett:

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

Entfernen Sie alle Tabellen, Spalten oder Daten mit den entsprechenden Methoden. Siehe \Magento\Framework\DB\Adapter\AdapterInterface, verfügbar als $setup->getConnection().

Ryan Hoerr
quelle
Danke für die Antwort. Ich werde testen und mit einem Ergebnis zurückkommen.
Marius
@Marius du hast nicht erwähnt, ob es für dich funktioniert oder nicht. Zusätzlich möchte ich wissen, ob dieses Deinstallationsskript direkt ausgeführt wird oder wenn wir das Modul ausführen: uninstall
Adnan
1
@Adnan. Ja. Es funktionierte. Das Skript wird aufgerufen, wenn der Konsolenbefehl ausgeführt wird. Deinstallieren Sie das Modul.
Marius
@Marius, Falls Sie ein Team haben, was sollten andere Entwickler tun? jeder von ihnen vor Ort sollte Befehl ausführen? Ist es in jedem Fall so, dass es beim nächsten Ziehen automatisch ausgeführt wird?
Sergio
[Ausnahme] Veraltete Funktionalität: Methoden mit demselben Namen wie ihre Klasse werden in einer zukünftigen Version von PHP keine Konstruktoren mehr sein. Uninstall hat einen veralteten Cnstructor in ... / Setup / Uninstall .php in Zeile 5
Pini