Laravel5でターミナル端末から実行可能なコマンドラインアプリケーションを作成してみます。Laravelでは artisan を拡張することで、コマンドラインアプリケーションを実装します。
今回作成するコマンド
Userテーブルを検索しユーザ名の一覧を表示するコマンドを作成します。オプションの指定によって、件数だけを表示することも可能とします。
$ php artisan user:list harry ron hermione $ php artisan user:list --count 3
コンソールコマンドクラスの生成
artisanを使って、コンソールコマンドクラスを生成します。
php artisan make:console ListUser
app/Console/Commands/ListUser.php が以下の様に生成されます。
<?php // app/Console/Commands/ListUser.php namespace App\Console\Commands; use Illuminate\Console\Command; class ListUser extends Command { protected $signature = 'command:name'; // ① 使用方法 protected $description = 'Command description.'; // ② 説明 public function __construct() { parent::__construct(); } public function handle() // ③ メイン処理 { // } }
①使用方法:artisanで使用するコマンド名、引数、オプションを設定します
②説明:artisanのヘルプで表示される説明を記述します
③メイン処理:このコマンドのメイン処理を記述します
使用方法の設定
コマンド名、引数、オプションを文字列で指定します。
protected $signature = 'command:name {argument} {--option}'
引数やオプションは以下のように記述できます。
// 引数(必須)
command:name {argument}
// 引数(任意)
command:name {argument?}
// 引数(初期値)
command:name {argument=default}
// オプション(true)
command:name {--option}
// オプション(値を受け取る)
command:name {--option=}
// オプション(値を受け取る or 初期値)
command:name {--option=default}
引数やオプションに説明を付けることもできます。
protected $signature = 'command:name
{argument : 引数の説明}
{--option : オプションの説明}';
今回作成するコマンドでは、以下のように設定します。
class ListUser extends Command { protected $signature = 'user:list {--count : ユーザー数のみ表示する}'; // ... }
説明の設定
コマンドの説明を記述します。
protected $description = 'ユーザ一覧を表示する';
メイン処理
handle()メソッドを以下のように実装します。
... use App\User; // 追加 class ListUser extends Command ... public function handle() // メイン処理 { if ($this->option('count')) { // ① $this->countUser(); } else { $this->listUser(); } } private function countUser() // ユーザー件数表示 { $this->info(User::count()); // ② } private function listUser() // ユーザー一覧表示 { User::all()->each(function($user) { // ③ $this->info($user->name); }); }
① ‘count’ オプションの入力有無で、処理を振り分けます。
② ユーザ件数を取得し表示します。
③ 全ユーザを取得し、名前を表示します。
# 引数、オプションの取得
以下のように行います。
// 引数の取得 $foo = $this->argument('foo'); // 全引数を配列で取得 $args = $this->argument(); // オプションの取得 $bar = $this->option('bar'); // 全オプションを配列で取得 $options = $this->option();
# 画面への情報出力
以下のように行います。
$this->info('Display this on the screen'); // 情報の出力 $this->error('Something went wrong!'); // エラーの出力
コマンドの登録
app/Console/Commands/Kernel.php に生成したコマンドクラスを登録します。
<?php // app/Console/Kernel.php namespace App\Console; // ... class Kernel extends ConsoleKernel { protected $commands = [ \App\Console\Commands\ListUser::class, // 追加 ]; // ... }
artisan を実行して、コマンドが登録されたか確認します。
$ php artisan Usage: command [options] [arguments] ... user user:list ユーザ一覧を表示する ...
コマンドと説明が表示されました。
helpの表示も確認します。
$ php artisan help user:list Usage: user:list [options] Options: --count ユーザー数のみ表示する ...
最終的なソース
<?php // app/Console/Commands/ListUser.php namespace App\Console\Commands; use Illuminate\Console\Command; use App\User; class ListUser extends Command { protected $signature = 'user:list {--count : ユーザー数のみ表示する}'; protected $description = 'ユーザ一覧を表示する'; public function __construct() { parent::__construct(); } public function handle() { if ($this->option('count')) { $this->countUser(); } else { $this->listUser(); } } private function countUser() { $this->info(User::count()); } private function listUser() { User::all()->each(function($user) { $this->info($user->name); }); } }
実行
以上で実装は完了です。以下のように動けば成功です。
$ php artisan user:list harry ron hermione $ php artisan user:list --count 3
まとめ
コマンドラインアプリケーションを作成出来るようになりました。今回はツール的な物を作成しましたが、同様の方法でバッチ処理も作成できます。
その他
今回説明していないもの
- 画面に質問を表示して入力値を取得する
- 他のコマンドを呼び出し
詳細は公式サイトをご覧ください。
http://laravel.com/docs/5.1/artisan