Magento 2 ถอนการติดตั้งโมดูล


13

เห็นได้ชัดว่าตอนนี้ Magento 2 รองรับสคริปต์ถอนการติดตั้งที่อนุญาตให้แก้ไข db schema เมื่อทำการถอนการติดตั้งโมดูล (horay !!)
ตามที่อธิบายไว้ในที่นี้สามารถใช้งานได้กับโมดูลที่ติดตั้งผ่านผู้แต่งเท่านั้น
(ฉันหวังว่ามันจะทำงานในอนาคตสำหรับโมดูลทั้งหมด แต่นั่นเป็นปัญหาที่แตกต่างกัน) สมมติว่าผมมีโมดูลที่เรียกว่า
โมดูลนี้ทำ 3 สิ่งที่ฉันต้องการจะลบเมื่อถอนการติดตั้ง Testing_Demo

  1. testing_demoเพิ่มตารางที่เรียกว่า ดังนั้นฉันต้องวางมันลง
  2. demoเพิ่มแอตทริบิวต์ผลิตภัณฑ์ที่เรียกว่า ดังนั้นสิ่งนี้ต้องถูกลบออก
  3. มีการตั้งค่าบางอย่างในอาจจะหรืออาจจะไม่ถูกเก็บไว้ในตารางsystem->configuration การตั้งค่าทั้งหมดเหล่านี้มีเส้นทางcore_config_data testing_demo/...ดังนั้นสิ่งเหล่านี้จำเป็นต้องถูกลบออกด้วย

สคริปต์การถอนการติดตั้งโมดูลของฉันควรมีลักษณะอย่างไร


ฉันเดาว่าสคริปต์การถอนการติดตั้งของคุณควรเป็นแบบทดสอบการรวมระบบเพื่อดูว่าการลบส่วนขยายของคุณจะทำให้ส่วนหน้าหรือความสัมพันธ์ของสคีมาหรือไม่
Anton S

ฉันไม่สามารถแย้งคุณได้ คุณอาจจะถูก แต่ฉันจะทำอย่างไร :)
Marius

ฉันไม่มีไอเดียที่คิด แต่ในทางทฤษฎีคุณควรทราบว่าข้อมูลที่คุณเก็บรวบรวมสามารถถูกทิ้งหรือไม่และดังนั้นกระบวนการถอนการติดตั้งควรเป็นคำแนะนำทีละขั้นตอนที่สั่งให้ร้านค้าตรวจสอบว่ากระบวนการต่อไปนี้มีผลกระทบต่อหนี้สินของผู้ค้า ลูกค้าอื่น ๆ ดังนั้นส่วนที่เป็นเรื่องทางเทคนิคล้วน ๆ อาจเป็นเรื่องง่ายที่จะสำรวจเลย์เอาต์และดูว่าส่วนขยายของคุณถูกอ้างอิงขยายส่วนอื่น ๆ ขึ้นอยู่กับส่วนอื่น ๆ ที่เหมือนกันกับส่วนขยายทั้งหมด แต่การตัดสินใจทางธุรกิจที่อยู่เบื้องหลัง ชี้ให้เห็นความขัดแย้ง
Anton S

ควรจัดการการพึ่งพาก่อนการถอนการติดตั้งดังนั้นนี่ไม่ใช่ปัญหาของฉัน สมมติว่าฉันตัดสินใจที่จะลบส่วนขยายทั้งหมดและไม่มีอะไรขึ้นอยู่กับมัน
Marius

ดังนั้นคุณต้อง จำกัด ให้แคบลงไปยังตารางการทุ่มตลาดธรรมดาและด้านข้อมูลของสิ่งต่าง ๆ ?
Anton S

คำตอบ:


18

ค้นหา codebase สำหรับให้UninstallInterface\Magento\Setup\Model\UninstallCollector

หากคุณค้นหาแล้วคุณจะพบว่าของที่ใช้ในการUninstallCollector \Magento\Setup\Console\Command\ModuleUninstallCommandมีความเกี่ยวข้องโดยเฉพาะ:

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

รวบรวมกันเราสามารถคาดเดา:

  1. โมดูลของคุณควรมีระดับที่Uninstall{module}\Setup\Uninstall.php
  2. Magento\Framework\Setup\UninstallInterfaceชั้นนี้ควรใช้
  3. คลาสนี้ควรมีuninstallวิธีการที่มีตรรกะที่จำเป็น
  4. วัตถุและวิธีการเดียวกันนี้มีให้สำหรับคุณเช่นเดียวกับในสคริปต์การตั้งค่าหรืออัปเกรด

ดังนั้นนี่คือโครงกระดูกของคุณ:

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

ลบตารางคอลัมน์หรือข้อมูลใด ๆ โดยใช้วิธีการที่เหมาะสม ดูที่มีอยู่เป็น\Magento\Framework\DB\Adapter\AdapterInterface$setup->getConnection()


ขอบคุณสำหรับคำตอบ. ฉันจะทดสอบและกลับมาพร้อมผลลัพธ์
Marius

@Marius คุณไม่ได้พูดถึงว่ามันเหมาะกับคุณหรือเปล่า นอกจากนี้ฉันต้องการทราบว่าสคริปต์ถอนการติดตั้งนี้จะทำงานโดยตรงหรือจะถูกเรียกใช้เมื่อเราเรียกใช้โมดูล: ถอนการติดตั้ง
Adnan

1
@Adnan ใช่. มันได้ผล สคริปต์ถูกเรียกใช้เมื่อรันคำสั่งคอนโซลอย่าถอนการติดตั้งโมดูล
Marius

@Marius, ในกรณีที่คุณมีทีมงาน, นักพัฒนาคนอื่น ๆ ควรทำอย่างไร? แต่ละคนในท้องถิ่นควรเรียกใช้คำสั่ง? มีกรณีใดบ้างที่จะรันโดยอัตโนมัติเมื่อมีการดึงครั้งต่อไปหรือไม่
sergio

[ข้อยกเว้น] เลิกใช้งานฟังก์ชั่น: วิธีการที่มีชื่อเดียวกันกับคลาสของพวกเขาจะไม่เป็นตัวสร้างใน PHP เวอร์ชันอนาคต ถอนการติดตั้งมี co nstructor ที่ไม่สนับสนุนใน ... / การตั้งค่า / ถอนการติดตั้ง. php ในบรรทัดที่ 5
Pini
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.