
【Laravel12】daysOfMonthの使い方とスケジュールメソッドを選ぶ基準
システム運用において、特定の日にのみタスクを実行したいケースは多々あります。
「毎月1日と15日に実行したい」「5日、10日、20日に処理を回したい」といった要件は、実務で非常によくあるものです。
2025年2月にリリースされたLaravel12では、こうした「月単位の日付指定」に対応するdaysOfMonthメソッドが導入されました。
この記事では、従来手法との比較を交えながら、新機能の使い方と使い分けを解説します。
Laravel11以前:複数日指定における従来の記述パターン
これまで、毎月複数の特定日を指定するには、主に3つの記述パターンがありました。しかし、それぞれに実装上の課題(考慮すべきポイント)を抱えていました。
1. monthlyOn を複数定義する
$schedule->command('report:generate')->monthlyOn(1, '00:00');
$schedule->command('report:generate')->monthlyOn(15, '00:00');同じコマンドを2回書くため、実行時間や処理内容を変更する際に修正漏れが発生するリスクがあります。
2. cron メソッドで直接記述する
$schedule->command('report:generate')->cron('0 0 1,15 * *');記述は簡潔ですが、cron書式に不慣れな開発者にとっては、パッと見て実行タイミングを判断しにくい場合があります。
3. foreach でループさせる
foreach ([1, 15] as $day) {
$schedule->command('report:generate')->monthlyOn($day, '00:00');
}コードは共通化できますが、実行日がループ処理の中に含まれるため、スケジュールの全体像を直感的に把握しにくくなります。
Laravel12で登場した daysOfMonth
Laravel12で追加された daysOfMonth メソッドを使えば、これまでの課題をすっきりと解決できます。
$schedule->command('report:generate')->daysOfMonth(1, 15)->at('00:00');引数に実行したい日を並べるだけで、単一のメソッドチェーンとして定義を完結できます。
スケジュールメソッド比較表
Laravel 12時点で利用できる、月単位で実行タイミングを制御するメソッドを整理します。
要件に合わせて最適なものを選択できるよう、一覧にまとめました。
| メソッド名 | 指定できる日の数 | 主な用途・特徴 |
|---|---|---|
monthly | 1日(固定) | 毎月1日のみのシンプルな処理に |
monthlyOn | 1日(任意) | 毎月10日など、特定の日を指定したいときに |
twiceMonthly | 2日 | 1日と15日など、月2回の定期処理に |
lastDayOfMonth | 最終日 | 月末の締め処理など、日付が変動する月末に |
daysOfMonth | 複数(制限なし) | 5日、10日、20日のように、3回以上の指定に最適 |
cron | 自由自在 | 複雑な条件が必要な場合の最終手段として |
daysOfMonth のメリットと活用シーン
このメソッドの最大の利点は、「実行日が異なっても、実行時間(at)の定義が1箇所で済む」ことです。
// 5日、10日、20日の朝9時に実行
$schedule->command('emails:send')->daysOfMonth(5, 10, 20)->at('09:00');実行日と実行時間を分けて表せるため、日付を追加したいときや実行時間を変更したいときも、1箇所の書き換えだけでスムーズに反映できます。
このように、コードの重複を避けつつ、一目で実行タイミングがわかる状態を維持できます。
導入時に押さえておきたいポイント
便利な新機能ですが、設計時に意識しておくべきポイントが2点あります。
1. 実行時間は全日程で共通になる
daysOfMonth(1, 15)->at('10:00') とした場合、1日と15日のいずれも10:00に実行されます。「1日は10時, 15日は20時」のように時間を分けたい場合は、従来通り monthlyOn を個別に定義してください。
2. 存在しない日付(31日など)の扱い
daysOfMonth(31) と指定した場合、31日が存在しない月(2月や4月など)には実行されません。月末に必ず実行したいタスクであれば、lastDayOfMonth を使用するのが適切です。
まとめ
Laravel12での改善は、単にコードを短縮するだけでなく、実行タイミングの意図をより正確に表現する助けになります。
- 月1回なら
monthlyOn - 月2回なら
twiceMonthly - 月3回以上なら
daysOfMonth - 月末なら
lastDayOfMonth
プロジェクトの要件に対して適切なメソッドを選び、メンテナンス性の高いスケジュール定義を目指しましょう。
カサレアルでは、Laravelを学ぶ方に向けて「Laravel入門」のコースを開催しています。
コースの詳細や開催日程に関しては以下のリンクをご覧ください。