Magento 2卸载模块


13

显然,现在Magento 2支持卸载脚本,该脚本允许在卸载模块时修改数据库架构(敬请期待!)。
如此处所述,这仅适用于通过composer安装的模块。
(我希望将来所有模块都可以使用,但这是一个不同的问题)。
假设我有一个名为的模块Testing_Demo
该模块执行3件事,我希望在卸载时将其删除。

  1. 添加一个名为的表testing_demo。所以我需要删除它。
  2. 添加名为的产品属性demo。所以这需要删除
  3. 的某些设置system->configuration可能会或可能不会存储在表中core_config_data。所有这些设置都有路径testing_demo/...。因此,这些也需要删除。

我的模块卸载脚本应如何显示?


我想您的卸载脚本应该更像是一个集成测试,以查看扩展的删除是否会破坏前端或架构关系
Anton S

我在那里不能和你矛盾。您可能是对的,但是我该怎么做?:)
Marius

我不知道这个想法,但从理论上讲,您应该知道收集的数据是否可以删除,因此卸载过程应该是逐步指南,它指示商家验证以下过程是否会对商户的会计核算产生影响,客户等等。因此,纯粹是技术性的部分可能很容易遍历布局,并查看您的扩展是否被引用,扩展,其他是否依赖于所有扩展的统一部分,但背后的业务决策仍由商人决定,您只能指出冲突
Anton S

依赖关系应该在卸载之前得到处理,所以这不是我的问题。假设我决定完全删除该扩展名,并且没有任何依赖它的内容。
马里斯(Marius)

所以您只需要将其范围缩小到简单的转储表和数据方面?
安东S

Answers:


18

搜索代码库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,您没有提到它是否对您有用。另外,我想知道此卸载脚本将直接运行还是在我们运行module:uninstall
Adnan

1
@Adnan。是。有效。在运行console命令并卸载模块时会调用该脚本。
马里乌斯

@Marius,如果您有团队,其他开发人员应该怎么做?他们每个人都应该在本地运行命令?是否可以在下一次拉动时自动运行它?
sergio

[异常]不推荐使用的功能:与类相同名称的方法在将来的PHP版本中将不再是构造函数;卸载在第5行上的... / Setup / Uninstall .php中已弃用的构造函数
Pini
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.