今携わっているプロジェクトでLaravelでバッチを作る必要があり、PHP初心者の私がはじめてみました。
目次
準備
Windows環境で開発するのでXAMPP+Composer+Lavavel+VSCodeで開始しました。インストール方法などはWebで調べてなんとかインストールしました。(省略)
Commandの作成
Laravelで新しいプロジェクトを作成してVSCodeでそのフォルダを開きます。まずは、「php artisan serve」で動くことを確認。
問題なく動作しました。次にmake:commandを使用してCommandクラスを作成します。今回はTestBatchというクラスを作ります。
作成されたクラスはapp\Console\Commandに格納されています。$signatureはコマンド実行するときに必要なので書き換えます。
実行するとコンソールに「TestBatchだよ」が表示されます。ひとまず動作確認ができました。
メソッド開始終了のログ
参考サイト:https://qiita.com/sakushin774/items/c16d6fb5b0ab574f8525
C#でいうアクションフィルターみたいなのないかなと探していたら使えそうなのがあったのでやってみました。
開始と終了をログ出力するクラスを作ります。
EventServiceProvider.phpの$listenにCommandStartingとCommandFinishedにそれぞれのクラスを紐づけします。
元の出力もログ出力に変えて、$signatureに引数も追加しています。
実行するとログの出力はこんな感じなります。
Logの時刻
ログ出力してみて「???」と思ったのがミリ秒がないんですよね。後で困ると思い調査しました。
ソース内をGrepして発見したのが、\vendor\laravel\framework\src\Illumionate\Log\LogManager.phpで日付フォーマットをしており「Y-m-d H:i:s」となっていました。確かにここを修正すればミリ秒が表示されるのですが、frameworkのソースなので違うなと思い別の方法を探しました。
そこで見つけたのが以下のサイトです。
参考サイト:https://qiita.com/mabasasi/items/be4b073b91433275a42c
まずappにLoggingフォルダを作成してその下にCustomLineFormatterクラスを作成しミリ秒が表示される日付フォーマットの設定を行います。表示されるメッセージの形式も変更する場合はここで設定します。
次にlogging.phpでバッチ用のログチャンネルを作成します。そこで上で作成したクラスをtapに指定します。
.envファイルでデフォルトのログチャンネルをbatchに変更します。
php artisan commad:testbatchで実行すると以下のログ出力が取得できました。ちゃんとミリ秒が表示されています。
おわりに
今回は、LaravelのCommandをやってみました。初めLaravelの使い方がわからず大変でしたが、日本語での情報が多く存在しており調べることにより進めることができました。次回はDB接続あたりをやろうと思います。