Module de désinstallation de Magento 2

13

Apparemment, Magento 2 prend désormais en charge les scripts de désinstallation qui permettent la modification du schéma db lors de la désinstallation d'un module (horay !!).
Comme expliqué ici, cela ne fonctionne que pour le module installé via composer.
(J'espère que cela fonctionnera à l'avenir pour tous les modules, mais c'est un problème différent).
Disons que j'ai un module appelé Testing_Demo.
Ce module fait 3 choses que j'aimerais supprimer lors de sa désinstallation.

  1. ajoute une table appelée testing_demo. Je dois donc le laisser tomber.
  2. ajoute un attribut de produit appelé demo. Donc, cela doit être supprimé
  3. contient certains paramètres system->configurationqui peuvent ou non être stockés dans le tableau core_config_data. Tous ces paramètres ont le chemin testing_demo/.... Il faut donc aussi les supprimer.

À quoi devrait ressembler mon script de désinstallation de module?

Marius
la source
J'imagine que votre script de désinstallation devrait ressembler davantage à un test d'intégration pour voir si la suppression de vos extensions
Anton S
Je ne peux pas vous contredire là-bas. vous avez probablement raison, mais comment faire? :)
Marius
Je n'ai aucune idée de jet, mais en théorie, vous devez savoir si les données que vous collectez peuvent être supprimées ou non et, par conséquent, le processus de désinstallation doit être un guide étape par étape qui demande à un commerçant de vérifier si le processus suivant a des effets sur le passif du commerçant en matière de comptabilité. , sur les clients, etc. donc la partie purement technique est probablement facile à parcourir les mises en page et voir si votre extension est référencée, étendue, d'autres dépendent etc. des pièces qui sont uniformes pour toutes les extensions mais les décisions commerciales derrière sont toujours à la discrétion du marchand et vous ne pouvez que signaler les conflits
Anton S
la dépendance doit être gérée avant la désinstallation donc ce n'est pas mon problème. Disons que j'ai décidé de supprimer complètement l'extension, et rien ne dépend d'elle.
Marius
vous avez donc juste besoin de restreindre cela à des tables de dumping simples et au côté des données?
Anton S

Réponses:

18

Recherche de la base de code pour UninstallInterfacedonne \Magento\Setup\Model\UninstallCollector.

Si vous recherchez UninstallCollectoralors, vous constaterez qu'il est utilisé dans \Magento\Setup\Console\Command\ModuleUninstallCommand. Particulièrement pertinent:

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

Ensemble, nous pouvons supposer:

  1. Votre module doit contenir une Uninstallclasse à {module}\Setup\Uninstall.php.
  2. Cette classe doit implémenter Magento\Framework\Setup\UninstallInterface.
  3. Cette classe doit avoir une uninstallméthode contenant toute logique nécessaire.
  4. Les mêmes objets et méthodes sont à votre disposition que dans tout script de configuration ou de mise à niveau.

Alors, voici votre squelette:

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

Supprimez toutes les tables, colonnes ou données à l'aide des méthodes appropriées. Voir \Magento\Framework\DB\Adapter\AdapterInterface, disponible en $setup->getConnection().

Ryan Hoerr
la source
Merci d'avoir répondu. Je vais tester et revenir avec un résultat.
Marius
@Marius, vous n'avez pas mentionné si cela fonctionnait pour vous ou non. De plus, j'aimerais savoir si ce script de désinstallation s'exécute directement ou s'il sera déclenché lorsque nous exécuterons le module: désinstallation
Adnan
1
@Adnan. Oui. Ça a marché. Le script est appelé lorsque vous exécutez la commande console, désinstallez le module.
Marius
@Marius, si vous avez une équipe, que devraient faire les autres développeurs? chacun d'eux localement devrait exécuter la commande? Y a-t-il un cas pour l'exécuter automatiquement avec la prochaine traction?
sergio
[Exception] Fonctionnalité obsolète: les méthodes portant le même nom que leur classe ne seront pas des constructeurs dans une future version de PHP; La désinstallation a un constructeur obsolète dans ... / Setup / Uninstall .php on line 5
Pini