バックエンドエンジニアと言えばWebアプリケーションのサーバーサイドの開発だけではなく、バッチ処理などのCLIで実行するようなコマンドラインアプリケーションを開発する機会も多いかと思います。
Laravelではバッチ処理などを実装するartisanコマンドを簡単に作成することができます。
この記事ではLaravelでartisanコマンドの作成方法を解説していきたいと思います。
artisanコマンドを作成する
Laravelでは下記のコマンドでCommand
クラスを継承したartisanコマンドを実装するためのファイルを簡単に作成することができます。
php artisan make:command SampleCommand
コマンドを実行すると、app/Console/Commandsディレクトリ直下にSampleCommand.phpファイルが生成されます。
SampleCommand.phpにはartisanコマンドを作成するための雛形が記述されています。
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
class SampleCommand extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'command:name';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Command description';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
return 0;
}
}
SampleCommand
クラスにはファイルが生成された時点で2つのプロパティと2つのメソッドが用意されているのがわかりますね。
$signature
プロパティの値でartisanコマンドの識別子を定義します。
$description
プロパティの値でartisanコマンドの処理内容の説明文を記載します。
コンストラクタメソッドでは、継承している親クラスのコンストラクタメソッドを呼んでいるだけですね。
handle
メソッドに作成するコマンドで行う実際の処理を記述します。
基本的にはたったこれだけでartisanコマンドを作成することができます。
では、実際にサンプルコマンドを作成してみましょう。
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
class SampleCommand extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'sample';
/**
* The console command description.
*
* @var string
*/
protected $description = 'これはサンプルコマンドです。';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
dump('サンプルコマンド実行');
return 0;
}
}
サンプルコマンドは$signature
に'sample'
を定義しているので、こちらのartisanコマンドはphp artisan sample
で実行することができるようになります。
$description
にはサンプルコマンドの説明文が記載されているだけですね。
handle
メソッドにコマンドの処理内容を記述しますが、今回はサンプルコマンドで単純に動作を確認したいだけなので、dump
メソッドで実行されたことが分かるようにしているだけです。
作成したコマンドを登録する
実はSampleCommand
を作成しただけではartisanコマンドを実行することができません。
Laravelアプリケーションに作成したSampleCommand
を登録する必要があります。
では、SampleCommand
を登録していきましょう。
app/Consoleディレクトリ直下にKernel.phpというファイルが存在します。
<?php
namespace App\Console;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
/**
* The Artisan commands provided by your application.
*
* @var array
*/
protected $commands = [
//
];
/**
* Define the application's command schedule.
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule)
{
// $schedule->command('inspire')->hourly();
}
/**
* Register the commands for the application.
*
* @return void
*/
protected function commands()
{
$this->load(__DIR__.'/Commands');
require base_path('routes/console.php');
}
}
ここで注目するのは$commands
プロパティの配列です。
この配列の中に作成したコマンドを追加することで、artisanコマンドとして利用することができるようになります。
use App\Console\Commands\SampleCommand;
protected $commands = [
SampleCommand::class
];
先ほど作成したSampleCommand
クラスをuse
して、SampleCommand::class
を$commands
配列に追加します。
これで作成したSampleCommand
が登録されて、artisanコマンドとして実行することができるようになりました。
作成・登録したコマンドの確認
それでは、SampleCommandを実行してみましょう。
まず、artisanコマンドとして登録されているかしっかり確認しておきましょう。
登録されたコマンドを確認するためには、下記のコマンドを実行することで確認することができます。
php artisan list
このコマンドを実行することで自分で作成・登録したコマンドだけではなく、Laravelでデフォルトで使えるコマンドの一覧を確認することができます。
作成したコマンドが無事に登録されていれば下記の表示がされています。
$ php artisan list
Available commands:
...
sample これはサンプルコマンドです。
...
SampleCommand
クラスの$signature
プロパティに定義したsample
と、$description
プロパティに定義した説明文が表示されていることが確認できます。
では最後にSampleCommandのartisanコマンドを実行してみましょう。
$ php artisan sample
"サンプルコマンド実行"
無事にartisanコマンドが実行されていることが確認できました。
基本的なartisanコマンドの作成がこれでできるようになりましたね。
引数を定義する
artisanコマンド作成する際に、ユーザーが入力する値を引数として受け取るように定義することができます。
{引数名}
と定義することで引数として認識させることができます。また、引数を任意にしたり、デフォルト値を指定することもできます。
// 必須の引数定義
protected $signature = 'sample {arg}';
// 任意の引数定義
protected $signature = 'sample {arg?}';
// デフォルト値を持つ引数定義
protected $signature = 'sample {arg=hoge}';
入力された引数を取得するにはargument
メソッドを利用します。
argument
メソッドの引数には定義した引数名を指定することで該当の引数に入力された値を取得することができます。
public function handle()
{
$value = $this->argument('arg');
}
引数を複数定義した場合に、全ての引数を取得するには、arguments
メソッドを使用することで入力された値を取得することができます。
public function handle()
{
$value = $this->arguments();
}
オプションを定義する
artisanコマンドでは、引数だけではなくオプションを定義することもできます。
{--オプション名}
と定義することでオプションとして認識させることができます。
コマンド実行時に--オプション
を指定して実行するとオプションの値はtrue
となり、何も指定しなければオプションの値はfalse
となります。
また、オプションは値を取るオプションを指定したり、デフォルト値を指定することもできます。
// オプション定義
protected $signature = 'sample {--opt}';
// 値を取るオプション定義
protected $signature = 'sample {--opt=}';
// デフォルト値を持つオプション定義
protected $signature = 'sample {--opt=hoge}';
指定されたオプションを取得するにはoption
メソッドを利用します。
option
メソッドの引数には定義したオプション名を指定することで該当のオプションの値を取得することができます。
public function handle()
{
$value = $this->option('opt');
}
オプションを複数定義した場合に、全てのオプションの値を取得するには、options
メソッドを使用することで指定されたオプションの値を取得することができます。
public function handle()
{
$value = $this->options();
}
作成したコマンドを別のコマンドから呼び出す
作成したartisanコマンドはCLIでの実行だけではなく、別の作成したコマンドから実行することもできます。
プログラムからのartisanコマンドの実行はcall
メソッドを使用することでできます。
public functon handle()
{
$this->call('sample', [
'arg' => 'foo',
'--opt' => 'bar'
]);
}
call
メソッドの第一引数に$signature
で定義した識別子を指定し、第二引数には連想配列の形式で引数やオプションを指定することもできます。
まとめ
Laravelでartisanコマンドを作成する方法を紹介してきました。
これでLaravelを使って簡単にバッチ処理を実装することが実感できたかと思います。
これを機会に公式リファレンスを確認したり、ご自身でバッチ処理の実装を行なってさらに理解を深めてくださいね。