Magento 2にCLIコマンドを追加するための正しいサポートされている方法


9

Magento 2モジュールにCLIコマンドを追加するための正しい正式にサポートされた方法はありますか?私が集めたものからあなたのオプションは

  1. コマンドクラスをファイル経由でのcommands引数に追加しますMagento\Framework\Console\CommandListdi.xml

  2. 経由でコマンドを登録\Magento\Framework\Console\CommandLocator::registerregistration.phpのファイルまたはcli_commands.phpファイル

これらのオプションはいずれもで祝福されていません@api。拡張機能の開発者として、コマンドラインスクリプトを追加して、バージョン間で固執する方法は明確ではありません。

これを行うためのThe Right™の方法に関する公式のMagentoポリシーがあるかどうか誰かが知っていますか?

回答:


6

cli_commands.phpコマンドが非モジュールパッケージに追加された場合に使用する必要があります。したがって、コマンドがモジュール内にあり、モジュールが有効になっている場合にのみ使用できることが問題ない場合(想定されている場合)は、di.xml使用する必要があります。モジュールを追加せず、任意のComposerパッケージのみを使用cli_commands.phpしたい場合は、そこにコマンドを登録するために使用できます。もちろん、Magentoから完全に独立している必要があります。または、今のところ、このアプローチを使用して、モジュールが無効になっている場合でも必要なコマンドを登録できます(有効になっている場合にのみ機能するモジュールのロジックに依存しないことを確認してください)。


11

正しい方法は次のとおりです。

あらゆる種類のモジュールと同じようにモジュールを作成します

registration.phpファイルを作成するだけ

\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    'My_Module',
    __DIR__
);

module.xmlファイルを作成します。

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
    <module name="My_Module" setup_version="0.1.0">
    </module>
</config>

にエントリを追加しdi.xmlます。

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="Magento\Framework\Console\CommandList">
        <arguments>
            <argument name="commands" xsi:type="array">
                <item name="my_command" xsi:type="object">My\Module\Command\Mycommand</item>
            </argument>
        </arguments>
    </type>
</config>

コマンドクラスを作成します。

<?php
namespace My\Module\Command;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class Mycommand extends Command
{
    protected function configure()
    {
        $this->setName('my:command');
        $this->setDescription('Run some task');

        parent::configure();
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $output->writeln('Hello world!');
    }
}

タスクを実行するには、次のように入力します。

php bin/magento my:command

互換性について:

@apiはコマンドには必要ありません。サービス契約の AFAIKに使用されます

それらに互換性を持たせる必要がある場合は、スクリプト内にロジックを置くのではなく、スクリプト内でインターフェースAPIを使用してください。

例えば:

<?php
use My\Module\Api\TaskInterface;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class MyCommand extends Command
{
    protected $taskInterface;

    public function __construct(
        TaskInterface $taskInterface
    ) {
        $this->taskInterface= $taskInterface;
        parent::__construct();
    }

    protected function configure()
    {
        $this->setName('my:command');
        $this->setDescription('Run some task');

        parent::configure();
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $this->taskInterface->runTask();

        $output->writeln('Done.');
    }
}

1
有用な情報、+ 1、でもそれでよろしいですか?Magentoのサンプルデータモジュールがcli_commands.phpメソッドを使用し、それはMagentoのは、実装の変更された場合破損する可能性が低いクリーナーだ、とMagento\Framework\Console\CommandList
アラン・ストーム

100%確信はありません。Magentoitslefだけがこれに答えることができますが、しばらく遊んでいます。 "cli_commands.php"を削除しても、bin / magentoでコマンドを使用できます。彼らもdi.xmlでそれらを宣言したので、ベータ版からまだそこにあるものだと思います。ビルダーや工場のように。表示されている場合、cli_command.phpはsample-dataでのみ使用されています。
Phoenix128_RiccardoT

@apiが非推奨になるとはどういう意味ですか?
クリストフ、フーマンで2016

@Kristof、申し訳ありませんが、トレーニングされたパートナーソリューションスライドの1つを正しく理解できなかったため、その文は無視してください。投稿を変更して削除しました。
Phoenix128_RiccardoT 2016

3

私が正しく理解した場合、DIを介してCommandListで定義されたコマンドは、インストールされたMagentoインスタンスでのみ使用可能であり、Magentoモジュールでのみ使用可能です(di.xmlで定義する必要があるため):https : //github.com/magento /magento2/blob/6352f8fbca2cbf21de88db0cf7f4555bfc60451c/lib/internal/Magento/Framework/Console/Cli.php#L124

上記のメソッドのMagento \ Framework \ App \ DeploymentConfig :: isAvailable()は、インストールされたMagento2を確認するために、構成内のインストール日付を確認します。https://github.com/magento/magento2/blob/6352f8fbca2cbf21de88db0cf7f4555bfc60451c/lib/ internal / Magento / Framework / App / DeploymentConfig.php#L83)。

一方、Magento \ Framework \ Console \ CommandLocatorで定義されたコマンドは常に利用可能であり、コンポーザーによって自動ロードされたファイル(たとえば、cli_commands.php)の静的CommandLocator :: registerメソッドを介して、非Magentoモジュールで定義することもできます。

https://github.com/magento/magento2/blob/6352f8fbca2cbf21de88db0cf7f4555bfc60451c/lib/internal/Magento/Framework/Console/Cli.php#L130

https://github.com/magento/magento2/blob/6352f8fbca2cbf21de88db0cf7f4555bfc60451c/lib/internal/Magento/Framework/Console/Cli.php#L146

両方の方法が必要であり、存在する権利があると思います


これは良い見解+1ですが、関連するモジュールがインストールされていないときにMagentoスクリプトが必要なのはなぜですか?
Phoenix128_RiccardoT 2016

1
インストールされていないmagentoインスタンスについて。magento2をインストールする前に使用できるコマンドがいくつかあります。たとえば、sampledata:deployコマンドは、magento2セットアップでサンプルデータを直接インストールする場合に有効です。
David Verholen

私はあなたが正しいと思います。したがって、Magentoモジュールの「正しい」方法は、(私の答えのように)di.xmlを使用し、モジュールをインストールする前にタスクを実行する必要がある場合は「cli_command.php」を使用することです。それは理にかなっています。
Phoenix128_RiccardoT 2016

ええ、それはそれであると思います。+1あなたは正しい(そして非常によく説明された)答えを持っていると思いますが、これはコメントに収まりませんでした;)
David Verholen

@David Verholenに感謝します。私の+1は私が+1を与えたことを意味していました。+ 1に値するだけではありませんでした;)
Phoenix128_RiccardoT
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.