Drushで簡単なコマンドを作成する

こちらのサイトではDRUPAL10に関連する記事を掲載しています。

今回は”drush_ex”というモジュール名にします。

作成するファイル

  • drush_ex.yml
  • drush.services.yml
  • composer.json
  • DrushExCommands.php

ディレクトリ構造は次のようにします。

では順に作成していきましょう。

① drush_ex.info.yml

name: Drush 9 Commands Example Custom test
description: custom Drush 9 commands Test.
core_version_requirement: ^8 || ^9 || ^10
type: module

モジュールの情報を記述します。モジュール一覧に表示されます。

② drush.services.yml

services:
  drush_ex.commands:
    class: Drupal\drush_ex\Commands\DrushExCommands
    tags:
      - { name: drush.command }

コマンドの中身が書かれているクラスを規定します。
ここは、「モジュール名.services.yml」ではなく、「drush.services.yml」になっていますが、カスタムDrushコマンドを作る際のDrupalルールのようです。間違いやすいので気をつけましょう!

③ composer.json

{
    "name": "drupal/drush_ex",
    "description": "Drush 9 commands test",
    "type": "drupal-module",
    "autoload": {
        "psr-4": {
            "Drupal\\drush_ex\\": "src/"
        }
    },
    "extra": {
        "drush": {
            "services": {
                "drush.services.yml": "^9"
            }
        }
    }
}
~    

このファイルはDrush10で必須となるようです。Drush9では無くても動作するようですが、一応作成しておきましょう。

④ DrushExCommands.php

このファイルはdrush.services.ymlに記述したとおり、drush_ex/src/Commands/に作成します。

例として2つコマンドを作成してみます。

最初はHelloとうつと単純にHelloと表示されるもの、2つ目は引数で引き渡された文字列をタイトルに新しい基本コンテンツタイプのコンテツを追加するものの二点です。

Helloコマンド

  /**
   * Echos back hello with the argument provided.
   *
   * @param string $name
   *   Argument provided to the drush command.
   *
   * @command test:hello
   * @aliases test-hello
   * @options arr An option that takes multiple values.
   * @options msg Whether or not an extra message should be displayed to the user.
   * @usage test:hello akanksha --msg
   *   Display 'Hello Akanksha!' and a message.
   */
  public function hello ($name, $options = ['msg' => FALSE]) {

    if ($options['msg']) {
      $this->output()->writeln('こんにちは- ' . $name . '! ごきげんいかがですか?');
    }
    else {
      $this->output()->writeln('こんにちは ' . $name . '!');
    }

  }


コマンド名はコメント内に定義されている「@command test:hello」です。”drush test:hello”でhello()が呼び出され、文字列が表示されます。

最初に、コマンドのネームスペースを定義します。
次に、今回必要なDrupalクラスを宣言します。

namespace Drupal\drush_ex\Commands;

use Drush\Commands\DrushCommands;
use Drupal\node\Entity\Node;

AddContentコマンド

  /**
   * Echos back hello with the argument provided.
   *
   * @param string $name
   *   Argument provided to the drush command.
   *
   * @command test:addcontent
   * @aliases test-addc
   * @usage test:addc
   *   Display 'Hello Akanksha!' and a message.
   */
  public function addcontent ($name) {

      $this->output()->writeln('基本コンテンツタイプにタイトル' . $name . ' のコンテンツを追加します!');

      $node = Node::create([
        'title' => $name,
        'type' => 'page',
        'body' => 'Drushコマンドによって生成されたコンテンツです。',
        //'uid' => 1,
      ]);
      $this->output()->writeln('データセット完了');
      $node->save();
      $this->output()->writeln('コンテンツ追加完了');
  }

こちらは、引数で引き渡された文字列をタイトルに新しい基本コンテンツタイプのコンテツを追加します。
コマンド名はコメント内に定義されている「@command test:addcontent」です。”drush test:addcontent”でaddcontent()が呼び出されます。引数に指定されたタイトルで新規の基本コンテンツが作成されます。

モジュールの有効化

ブラウザからサイトにアクセスし、今作成したモジュールがモジュール一覧に表示されていますので、チェックをして画面下にあるインストールボタンをクリックします。

成功すると以下のメッセージが表示されます

コマンドの実行

実行前に、一度キャッシュとリビルドする必要があります

# drush cr
# drush test:hello abc

このサイトに関するご意見・ご質問はこちらまで

この記事またはDrupalに関するご質問がございましたら、お気軽にお問い合わせください。

タイトルとURLをコピーしました