the desk by http://streetwill.co/posts/239-the-desk

laravel 5で単純なコマンドラインアプリケーションを作ってみる


the desk by http://streetwill.co/posts/239-the-desk

Laravel 5が2月にリリースされました。良い機会なのでLaravelのコマンドラインアプリケーション部分をさわりながら、単純なアプリケーションを作った備忘録的な記事です。

Laravelのインストール

composerでlaravelをインストールします。composerはホームディレクトリに置いているということで。

artisanコマンドでクラスを生成する

artisan make:consoleコマンドでHelloCommandというクラスを生成します。 app/Console/Command/ に生成されるファイルの名前はクラス名と同じHelloCommand.phpになります。

nameとdescriptionの設定

app/Console/Command/ 内にHelloCommand.phpというファイルが生成されているので、テキストエディタ等でファイルを開いて$nameと$descriptionの両変数の値を設定します。$nameはコマンドの名前、$descriptionはコマンドの説明文などです。

どちらの変数もphp artisan listを実行した際に表示されますが、この時点ではphp artisan listを実行しても表示される利用可能なコマンド一覧の中に$nameで指定したhelloは入っていません。helloコマンドを利用するには後ほど登録する必要があります。

コマンドクラス生成と同時にnameに値を追加する例

ここまではコマンドクラスを生成した後に$nameと$desctiptionを手動で設定していますが、-commandオプションを使うと生成時にnameの値を設定することができます。

作成したコマンドを登録する

コマンドクラスを作成しただけでは使用できないので、登録して使用できるようにします。
作成したコマンドクラスを登録するには app/Console/Kernel.php ファイル内の$commandsプロパティに追記します。

例:

helloコマンドが使用できるか確認する

listコマンドを使って、先ほど登録したhelloコマンドがリストに表示されるかを確認します。

php artisan listで一覧表示

表示されました。これでhelloコマンドが使用できます。

コマンドの処理

ここでLaravel公式ドキュメントのコマンドラインを参考に少し簡単なコマンドの書き方まとめ。

実行時の処理

コマンドが実行されるとfire()メソッドが呼ばれます。ロジックはこの中に書きます。

引数

コマンドの実行時に渡す引数はgetArguments()で設定します。
生成された際のgetArguments()は下のようになっているかと思います。

返される配列の中の配列は
[引数名, 引数のモード,引数の説明] という順番で、配列の1番目は引数名、2番目は引数のモード。デフォルトでは引数を必ず渡す必要がある InputArgument::REQUIRED になっています。3番目は–helpを付けた際に表示される引数の説明文です。

引数のモード

指定できる引数のモードは2つ。

  • InputArgument::REQUIRED – 引数は必須
  • InputArgument::OPTIONAL – 引数は任意(省略可能)

また、任意(InputArgument::OPTIONAL)を指定した場合は、引数が付けられなかった際のデフォルト値を配列の4番目([引数名, 引数のモード,引数の説明,引数のデフォルト値])に指定できます。

引数の値を取得する

全ての引数の値は$this->argument()で取得できます。

特定の引数の値を取得するには引数名を指定します。下はargという引数の値を取得。

オプション

コマンド実行時に指定したいオプションはgetOptionsで設定します。
生成された際のgetOptions部分は下のようになっているかと思います。

返される配列の中の配列は、 [オプション名, ショートカット, オプションのモード, オプションの説明, デフォルト値] となっています。デフォルトでは php artisan hello foo —example=bar でオプションを指定できます。

指定できるオプションのモードは4つ

  • InputOption::VALUE_REQUIRED – オプションは必須
  • InputOption::VALUE_OPTIONAL – オプションは任意
  • InputOption::VALUE_IS_ARRAY – 複数のオプション値を配列として受け取る
  • InputOption::VALUE_NONE – オプションは渡すが値は指定しない

InputOption::VALUE_REQUIRED指定例

オプションの入力を必須にする場合。

InputOption::VALUE_OPTIONAL指定例

オプションの入力を任意にする場合。

またはオプションは付けるけど値を渡さずに実行する場合。

InputOption::VALUE_IS_ARRAY指定例

複数のオプション値を配列として受け取る場合、InputOption::VALUE_IS_ARRAYを単体で使うと [InvalidArgumentException] Impossible to have an option mode VALUE_IS_ARRAY if the option does not accept a value.と表示されるので、VALUE_REQUIREDまたはVALUE_OPTIONALと組み合わせて使います。

InputOption::VALUE_NONE指定例

オプションは渡すが値は指定しない場合。

ショートカット

オプション名のショートカットを指定できます。下はexampleの代わりに–eをショートカットとして使う設定例。

オプションの値を取得する

全てのオプションの値は$this->option()で取得できます。

特定のオプションの値を取得するには引数名を指定します。下はoptというオプションの値を取得する場合。

コンソールに文字列を表示

$this->info()に表示したい文字列を指定します。

エラーメッセージの表示

質問

質問を表示してそれに対する答えを取得する。

入力した値は$nameに入ります。

コンソールに表示せずに入力させる

パスワードなど入力した値をコンソールに表示させたくない場合は $this->secret を使用します。

上記の場合、入力した値は$passwordに入ります。

確認

入力などに対して確認のダイアログを表示したい場合は $this->confirm を使用します。


コマンドラインアプリケーションを作ってみる

前置きが長くなりましたが、簡単なコマンドラインアプリケーションを作ってみます。

やりたいこと

コマンド実行時、引数に名前を渡すと「xxさん、こんにちは」の後に「お元気ですか?」と尋ねる。

アプリケーション名

上の例と同じくhelloCommandという名前にします。

$nameと$description

引数

引数名はyour name。実行時には必ず入力してもらうので InputArgument::REQUIRED を指定します。

fire()

渡された引数を取得して表示して、その後confirm()で質問。

実行時の時間で挨拶文を変えるgetGreeting。

helloコマンド実行結果

helloコマンド実行結果

とこんな感じでした。Laravel 4との違いは生成するコマンドや生成されるファイルの場所ぐらいかなという印象。今回は超がつく程の単純なアプリケーションだったのでコマンドラインアプリケーションのコード部分では違いに気付きませんでしたが、モデル等を使う場合はもっと違いが分かるようになるかもしれないです。

参考サイト

Your One-Stop Guide to Laravel Commands