Modul penghapusan Magento 2

13

Rupanya, sekarang Magento 2 mendukung skrip uninstall yang memungkinkan modifikasi skema db ketika mencopot modul (horay !!).
Seperti yang dijelaskan di sini, ini hanya berfungsi untuk modul yang dipasang melalui komposer.
(Saya berharap ini akan bekerja di masa depan untuk semua modul, tapi itu masalah yang berbeda).
Katakanlah saya memiliki modul yang disebut Testing_Demo.
Modul ini melakukan 3 hal yang ingin saya hapus ketika mencopotnya.

  1. menambahkan tabel yang disebut testing_demo. Jadi saya harus menjatuhkannya.
  2. menambahkan atribut produk yang disebut demo. Jadi ini perlu dihapus
  3. memiliki beberapa pengaturan system->configurationyang mungkin atau mungkin tidak disimpan dalam tabel core_config_data. Semua pengaturan ini memiliki jalur testing_demo/.... Jadi ini perlu dihapus juga.

Seperti apa bentuk skrip penghapusan modul saya?

Marius
sumber
Saya kira skrip penghapusan instalan Anda harus lebih seperti tes integrasi untuk melihat apakah penghapusan ekstensi Anda akan meningkat pada frontend atau hubungan skema
Anton S
Saya tidak bisa menentang Anda di sana. Anda mungkin benar, tetapi bagaimana saya melakukannya? :)
Marius
Saya tidak punya ide jet tetapi secara teori Anda harus tahu apakah data yang Anda kumpulkan bisa dijatuhkan atau tidak dan karena itu proses penghapusan harus menjadi panduan langkah demi langkah yang menginstruksikan pedagang untuk memverifikasi jika proses berikut ini memiliki efek pada kewajiban pedagang pada akuntansi , pada klien dll. jadi bagian yang murni teknis mungkin mudah untuk melintasi tata letak dan melihat apakah ekstensi Anda direferensikan, diperpanjang, yang lain tergantung bagian dll yang seragam untuk semua ekstensi tetapi keputusan bisnis di belakang masih tergantung pedagang untuk memutuskan dan Anda hanya bisa tunjukkan konflik
Anton S
ketergantungan harus ditangani sebelum menghapus jadi ini bukan masalah saya. Katakanlah saya memutuskan untuk menghapus ekstensi sepenuhnya, dan tidak ada yang bergantung padanya.
Marius
jadi Anda hanya perlu mempersempit ini ke meja dumping sederhana dan sisi data hal?
Anton S

Jawaban:

18

Mencari basis kode untuk UninstallInterfacememberi \Magento\Setup\Model\UninstallCollector.

Jika Anda mencari UninstallCollectormaka, Anda akan menemukan yang digunakan di \Magento\Setup\Console\Command\ModuleUninstallCommand. Sangat relevan:

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

Disatukan, kita dapat menduga:

  1. Modul Anda harus berisi Uninstallkelas di {module}\Setup\Uninstall.php.
  2. Kelas ini harus diimplementasikan Magento\Framework\Setup\UninstallInterface.
  3. Kelas ini harus memiliki uninstallmetode yang mengandung logika yang diperlukan.
  4. Objek dan metode yang sama tersedia untuk Anda seperti pada skrip pengaturan atau pemutakhiran apa pun.

Jadi, inilah kerangka Anda:

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

Hapus semua tabel, kolom, atau data menggunakan metode yang sesuai. Lihat \Magento\Framework\DB\Adapter\AdapterInterface, tersedia sebagai $setup->getConnection().

Ryan Hoerr
sumber
Terima kasih atas jawabannya. Saya akan menguji dan kembali dengan hasil.
Marius
@Marius Anda tidak menyebutkan apakah itu bekerja untuk Anda atau tidak. Selain itu saya ingin tahu apakah skrip penghapusan instalan ini berjalan langsung atau akan dipicu ketika kita menjalankan modul: uninstall
Adnan
1
@Adnan. Iya. Itu berhasil. Script dipanggil saat menjalankan perintah konsol jangan uninstall modul.
Marius
@Marius, Jika Anda memiliki tim, apa yang harus dilakukan pengembang lain? masing-masing secara lokal harus menjalankan perintah? Apakah ada kasus untuk menjalankannya secara otomatis dengan tarikan berikutnya?
sergio
[Pengecualian] Fungsi yang tidak berlaku: Metode dengan nama yang sama dengan kelas mereka tidak akan menjadi konstruktor dalam versi PHP yang akan datang; Uninstall memiliki co nstructor yang sudah tidak digunakan lagi di ... / Setup / Uninstall .php on line 5
Pini