第38回: Artisanコマンド作成 — 繰り返し作業を「コマンド1本」で自動化する

章: 第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基礎 を学びます。テストを自動化してコードの動作を安定的に保証する方法を整理しましょう。

Related Articles