Moduł odinstalowujący Magento 2


13

Najwyraźniej teraz Magento 2 obsługuje skrypty odinstalowujące, które pozwalają modyfikować schemat db podczas odinstalowywania modułu (horay !!).
Jak wyjaśniono tutaj, działa to tylko w przypadku modułu zainstalowanego przez kompozytora.
(Mam nadzieję, że będzie działać w przyszłości dla wszystkich modułów, ale to inny problem).
Powiedzmy, że mam moduł o nazwie Testing_Demo.
Ten moduł wykonuje 3 rzeczy, które chciałbym usunąć podczas odinstalowywania.

  1. dodaje tabelę o nazwie testing_demo. Więc muszę to upuścić.
  2. dodaje atrybut produktu o nazwie demo. Więc to musi zostać usunięte
  3. ma pewne ustawienia, system->configurationktóre mogą, ale nie muszą być przechowywane w tabeli core_config_data. Wszystkie te ustawienia mają ścieżkę testing_demo/.... Dlatego należy je również usunąć.

Jak powinien wyglądać skrypt odinstalowujący moduł?


Wydaje mi się, że skrypt dezinstalacyjny powinien być bardziej testem integracyjnym, aby sprawdzić, czy usunięcie rozszerzeń spowoduje awarię interfejsu lub schematu
Anton S

Nie mogę ci tam zaprzeczyć. prawdopodobnie masz rację, ale jak to zrobić? :)
Marius

Nie mam pojęcia, ale teoretycznie powinieneś wiedzieć, czy dane, które gromadzisz, można usunąć, czy nie, dlatego proces odinstalowywania powinien być krok po kroku, który instruuje kupca, aby sprawdzić, czy następujący proces ma wpływ na zobowiązania kupieckie w zakresie księgowości , na klientach itp. więc część, która jest czysto techniczna, jest prawdopodobnie łatwa do przejścia przez układy i sprawdź, czy twoje rozszerzenie jest przywoływane, rozszerzone, inne zależą itp. części, które są jednolite dla wszystkich rozszerzeń, ale decyzje biznesowe za nimi nadal muszą być podejmowane przez kupca i możesz tylko wskaż konflikty
Anton S

zależność powinna być obsłużona przed odinstalowaniem, więc to nie jest mój problem. Powiedzmy, że postanowiłem całkowicie usunąć rozszerzenie i nic nie zależy od tego.
Marius

więc musisz to zawęzić do zwykłych tabel zrzutu i danych?
Anton S

Odpowiedzi:


18

Przeszukiwanie bazy kodowej pod kątem UninstallInterfacedaje \Magento\Setup\Model\UninstallCollector.

Jeśli tak UninstallCollector, to zauważysz, że jest używany w \Magento\Setup\Console\Command\ModuleUninstallCommand. Szczególnie istotne:

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

Podsumowując, możemy przypuszczać:

  1. Twój moduł powinien zawierać Uninstallklasę na {module}\Setup\Uninstall.php.
  2. Ta klasa powinna implementować Magento\Framework\Setup\UninstallInterface.
  3. Ta klasa powinna mieć uninstallmetodę zawierającą niezbędną logikę.
  4. Dostępne są te same obiekty i metody, co w każdym skrypcie instalacyjnym lub aktualizacyjnym.

Oto twój szkielet:

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

Usuń wszystkie tabele, kolumny lub dane przy użyciu odpowiednich metod. Zobacz \Magento\Framework\DB\Adapter\AdapterInterfacedostępne jako $setup->getConnection().


Dziękuję za odpowiedź. Przetestuję i wrócę z wynikiem.
Marius

@Marius nie wspomniałeś, czy to działa dla Ciebie, czy nie. Dodatkowo chciałbym wiedzieć, to będzie odinstalować skrypt jest uruchamiany bezpośrednio lub zostanie uruchomiony, gdy uruchamiamy moduł: dezinstalacji
Adnan

1
@Adnan. Tak. Zadziałało. Skrypt jest wywoływany podczas uruchamiania polecenia konsoli do odinstalowania modułu.
Marius

@Marius, jeśli masz zespół, co powinni zrobić inni programiści? każdy z nich powinien uruchomić polecenie? Czy jest jakiś przypadek, aby uruchomić go automatycznie przy następnym pociągnięciu?
sergio

[Wyjątek] Przestarzała funkcjonalność: Metody o tej samej nazwie co ich klasa nie będą konstruktorami w przyszłej wersji PHP; Odinstaluj ma przestarzały konstruktor w ... / Setup / Uninstall .php on line 5
Pini
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.