章: 第4章: Laravelフレームワーク
バッチ処理や初期化作業を、毎回手作業でやっていませんか?
古いデータのクリーンアップ・通知の一括送信・マスタデータの投入など、定期的に実行する作業をコマンド化しておくと、運用ミスと手作業コストを大幅に削減できます。Artisanカスタムコマンドを作成すれば、php artisan 1本で実行できます。
作業を手動でやり続けると何が起きるか
手順書通りに動かしても手順の抜け・引数の打ち間違い・実行者依存のばらつきが発生しやすくなります。コマンド化することで、誰が実行しても同じ結果になる再現性のある運用手順を作れます。
Artisanコマンドの良い例・悪い例
| 観点 | 悪い例 | 良い例 |
| 実行方法 | 手順書に従って複数コマンドを手動実行 | php artisan posts:clean --days=60 1本で完結 |
| オプション | ハードコードされた固定値 | {--days=30} でオプション引数として外出し |
| 出力 | 何も表示されない | $this->info() / $this->error() で結果を表示 |
| スケジュール | crontabに直接コマンドを書く | Laravelスケジューラで ->daily() 登録 |
チェックポイント: コマンドには必ず
$this->info()か$this->error()で実行結果を出力しましょう。件数や成否が見えないコマンドは、実行後に正しく動いたか確認できません。スケジューラに登録する場合はログへの出力も合わせて設定してください。
コードサンプル
<?php
// php artisan make:command CleanOldPosts
class CleanOldPosts extends Command {
protected $signature = 'posts:clean {--days=30 : 削除する日数}';
protected $description = '指定日数より古い下書きを削除します';
public function handle(): void {
$days = (int) $this->option('days');
$count = Post::where('status', 'draft')
->where('created_at', '<', now()->subDays($days))
->delete();
$this->info("{$count}件削除しました");
}
}
// 実行: php artisan posts:clean --days=60
まとめ & 次のステップ
- Artisanカスタムコマンドで繰り返し作業を自動化し、運用ミスを防げます
protected $signatureでコマンド名・引数・オプションを宣言的に定義できますhandle()メソッドに実行ロジックを書き、$this->info()で結果を出力しましょうapp/Console/Kernel.phpのスケジューラに登録して定期実行できます- テストでは
$this->artisan('posts:clean', ['--days' => 60])で実行結果を検証できます
次回は PHPUnit基礎 を学びます。テストを自動化してコードの動作を安定的に保証する方法を整理しましょう。