今回の記事では、Magento2でのコマンドラインモジュールの作成方法を解説していきたいと思います。 コマンドラインモジュールとは、php bin/magento で動作するモジュールのことを言います。例えば、

php bin/magento cache:clean

php bin/magento setup:upgrade

などMagento2には便利なコマンドがデフォルトで多数用意されています。今回は解説を交えながら、Hello Worldを返す簡単なコマンドラインモジュールを作成していきたいと思います。

今回は以下のようなステップで解説していきます。

  1. モジュールの基本ファイルの作成
  2. Commandファイルの作成
  3. di.xmlファイルの作成
  4. モジュールの有効化
  5. オプション設定
  6. まとめ

1.モジュールの基本ファイルの作成

モジュール作成の際は、以下の三点が必須となります。今回は以下のファイルの作成方法は割愛させていただきます。詳しい内容が知りたいという方は公式ドキュメント該当ページをご確認ください。

  • composer.json
  • registration.php
  • /etc/module.xml

2.Commandファイルの作成

Symfony\Component\Console\Command\Commandクラスを継承させた、 Test > Console > Command > HelloCommand.phpファイルを作成します。 このファイルで、コマンド名やコマンド詳細、オプションなどの設定を行なっていきます。 今回は以下のように記述しました。

<?php
namespace Test\Console\Command;

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

class HelloCommand extends Command
{
    const INPUT_SAY_WORD = 'say_word';

    protected function configure()
    {
        $this->setName('say:hello_world');
        $this->setDescription('return Hello World');
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $message = 'Hello World';
        $output->writeln($message);
    }
}
  • $this->setName          :コマンド名を設定します
  • $this->setDescription  :コマンドの説明を設定します
  • $this->setDefinition    :コマンドにオプション設定を加えることができます

$inputを利用して、argumentsやoptionsの値を受け取ることができます。また、$outputを利用して、ディスプレイへの表示をすることができます。

3. di.xmlファイルの作成

先程作成したクラスを、Magentoのコマンドを管理しているクラスが認識できるよう、di.xmlで定義を行います。

<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="hello" xsi:type="object">Test\Console\Command\HelloCommand</item>
            </argument>
        </arguments>
    </type>
</config>

 

4.モジュールの有効化

 

作成したモジュールを有効化していきます。

php bin/magento module:enable Test_Console

モジュールの有効化ができましたら、以下のコマンドを実行して、作成したコマンドが使用できるか確認してみましょう。

php bin/magento list

コマンドリストで確認ができたら、実際に実行してみましょう。 Hello Worldと表示されていることが確認できると思います。

$$$:/var/www/src# php bin/magento say:hello_world 
Hello World

5.オプション設定

簡単なコマンドラインの作成は上記の手順で完了ですが、OptionやArgumentを利用することで、より柔軟なコマンドを作成することができるようになります。

そこで、今回は今までのコードを少しいじり、Hello Worldと返すコマンドを、オプションから入力を受け取りその入力値をそのまま返すコマンドを作成したいと思います。

<?php
namespace Test\Console\Command;

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

class HelloCommand extends Command
{
    const INPUT_SAY_WORD = 'say_word';

    protected function configure()
    {
        $this->setName('say:hello_world');
        $this->setDescription('return Hello World');
        $this->addOption(
            self::INPUT_SAY_WORD,
            's',
            InputOption::VALUE_OPTIONAL,
            'You can use words you want to say',
            'Hello World'
        );
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $message = $input->getOption(self::INPUT_SAY_WORD);
        $output->writeln($message);
    }

オプションを設定して、もう一度コマンドを実行してみましょう。オプションに入力した値がディスプレイに表示されていると思います。

$$$:/var/www/src# php bin/magento say:hello_world --say_word='Hello AAAA'
Hello AAAA

addOptionは以下の引数を必要とします。

  • オプション名               コマンドオプションの名前になります
  • 短縮名         (=NULL)   短縮コマンドを指定します (--help --> -h)
  • 入力値指定   (=NULL)   入力値は下記のように指定します。
  • 説明                           オプションの概要を記述します。
  • デフォルト値(=NULL)   デフォルトの値を設定します。

オプションに対する入力値を第三引数で指定します

  • VALUE_NONE          入力値を必要としない時
  • VALUE_REQUIRED 入力値を必須とする時
  • VALUE_OPTIONAL   任意の値
  • VALUE_IS_ARRAY    配列

6.まとめ

今回はコマンドラインで使用できるモジュールの作成方法を解説していきました。便利なコマンドを作成しておくことで、開発がよりスムーズに行えるようになると思います。

また、コマンドラインではOptionの他に引数を指定しないArgumentという選択肢もあるので、作成したいコマンドラインモジュールに応じて、適宜使用してみてください。

モジュールのソースコードは下記リンクを参照してください。

https://github.com/Taku-Yamashita/cli-module