【 環境 】
Laravel のバージョン: 8.16.1
PHP のバージョン: 7.4.7
コマンドを作成する時、以下のようなコマンドで雛形を作ることが出来ます。 (例:SampleCommand クラス)
php artisan make:command SampleCommand
上記のコマンドで作成されるファイルは、こんな感じ。
app\Console\Commands\SampleCommand.php
class SampleCommand extends Command
{
// 中略
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
return 0;
}
}
handle メソッドの「return 0;」って何?
と思って調べてみたら、どうやら、コマンドを実行した時に帰って来る終了コードみたい。
終了コードって?
直前に実行したコマンド(ジョブ等)が、成功したのか失敗したのかを識別するためのコード。
Linux の場合、以下のコマンドで確認できる。
echo $?
0 : 成功
0以外 : 失敗(エラーコード)
といった感じ。
PHPユニットの実行結果の合否判定にも使えます。
(例) php artisan test --testsuite=Unit
handle メソッドの return
コマンドから作成する雛形を実行した時、必ず 0 が返ってくるので、常に「成功」と判断される。
何かしらの処理を実行して、成功したか/失敗したかを判断したいなら、リターンコードを返してもいいかもしんない。
public function handle() { $returnCode = $this->accountService->destroyLockedAccount(); // 本当は直接返してもいいけど、説明するにはこっちが分かりやすそうだったんで。 return $returnCode }
ちなみに return を省略した場合「0」が返る。
コマンドラインからコマンドを実行する場合「;」で繋げて実行結果を出力するといいかもしれません。
php artisan command:name ; echo $?
スケジューラでもリターンコードは取得できる?
調べてみたが、どうやら出来ないみたい。
$schedule->command の戻り値は event で、コマンドの実行結果を格納されるワケではない。
メソッドチェーンの先に実行結果のリターンコードを取得できるメソッドが無いか調べてみたが、どうやら無さそう。
という事で、スケジューラからコマンドを実行する場合、コマンドが成功したかどうかを判断する場合、各々のメソッドで識別が必要。
class Kernel extends ConsoleKernel { protected function schedule(Schedule $schedule) { $event = $schedule->command(SampleCommand::class) ->everyMinute(); dump($event->expression); //=> "* * * * *" //// 本当はこんな感じで書いてみたかった // // $returnCode = $schedule->command(SampleCommand::class) // if($returnCode === 0){ // \Log::info('SampleCommand は正常に終了しました。'); // }else{ // \Log::error("SampleCommand は異常終了しました。エラーコード{$SampleCommand}"); // } }