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

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

 

 

 

 

今回はコマンドラインからさまざまな処理を実行できるDrushに独自コマンドを作成追加する方法を調査したのでここにその作成手順を残しておきます。

今回は"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

 

 

 

 

 


この記事に関するご質問やご意見などございましたらお問い合わせフォームからお気軽にご連絡ください。