Magento 2アンインストールモジュール


13

どうやら、Magento 2は、モジュールをアンインストールする際にdbスキーマの変更を許可するアンインストールスクリプトをサポートしているようです(horay !!)。
ここで説明したように、これは composerを介してインストールされたモジュールでのみ機能します。
(将来、すべてのモジュールで機能することを願っていますが、それは別の問題です)。
というモジュールがあるとしましょうTesting_Demo
このモジュールは、アンインストール時に削除したい3つのことを行います。

  1. というテーブルを追加しますtesting_demo。だから私はそれを落とす必要があります。
  2. という製品属性を追加しますdemo。これは削除する必要があります
  3. system->configurationテーブルに保存されるかもしれないかもしれないいくつかの設定があるcore_config_data。これらすべての設定にはパスがありますtesting_demo/...。したがって、これらも削除する必要があります。

モジュールのアンインストールスクリプトはどのようになりますか?


私はあなたのアンインストールスクリプトは、あなたの拡張機能の除去がフロントエンドまたはスキーマの関係をfとなりますかどうかを確認するために、より統合テストのようにする必要がありますね
アントン・S

そこに矛盾することはできません。あなたはおそらく正しいですが、どうすればいいですか?:)
マリウス

ジェット機のアイデアはありませんが、理論的には、収集したデータをドロップできるかどうかを知っている必要があります。したがって、アンインストールプロセスは、次のプロセスが会計上の商人の負債に影響を与えるかどうかを商人に確認するためのステップバイステップガイドである必要があります、クライアントなど したがって、純粋に技術的な部分はおそらくレイアウトをたどりやすく、拡張機能が参照されているか、拡張されているか、他の部分がすべての拡張機能に均一であるなどの部分を確認するのは簡単ですが、背後にあるビジネス上の決定は決定する商人次第です。競合を指摘
アントンS

アンインストールの前に依存関係を処理する必要があるため、これは私の問題ではありません。拡張機能を完全に削除することにしたとしましょう。それに依存するものは何もありません。
マリウス

あなたはただこれを単純なダンプテーブルと物事のデータ側に絞り込む必要がありますか?
アントンS

回答:


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()


答えてくれてありがとう。テストして結果を返します。
マリウス

@マリウスは、それがあなたのために働いているかどうかについて言及しませんでした。さらに、このアンインストールスクリプトが直接実行されるか、module:uninstall
Adnan

1
@アドナン。はい。動いた。スクリプトは、コンソールコマンドを実行してモジュールをアンインストールするときに呼び出されます。
マリウス

@Marius、チームがある場合、他の開発者は何をすべきですか?それらのそれぞれがローカルでコマンドを実行する必要がありますか?次のプルで自動的に実行する場合はありますか?
セルジオ

[例外]非推奨の機能:クラスと同じ名前のメソッドは、PHPの将来のバージョンではコンストラクターになりません。アンインストールは、5行目に... /セットアップ/アンインストールの.phpで非推奨のCO nstructorを持っている
ピーニ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.