【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時点で利用できる、月単位で実行タイミングを制御するメソッドを整理します。
要件に合わせて最適なものを選択できるよう、一覧にまとめました。

メソッド名指定できる日の数主な用途・特徴
monthly1日(固定)毎月1日のみのシンプルな処理に
monthlyOn1日(任意)毎月10日など、特定の日を指定したいときに
twiceMonthly2日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入門」のコースを開催しています。

コースの詳細や開催日程に関しては以下のリンクをご覧ください。

【改訂版】Laravel入門

--------------------------
開発支援・技術研修のご要望・ご相談はこちらから
--------------------------
【この技術ブログを読んだエンジニアの皆様へ】
カサレアルブログをお読みいただき、ありがとうございます!

私たちは、常に新しい技術に挑戦し、ユーザーのニーズに応えるサービスを提供しています。
もし、当社の技術への情熱や、会社・チーム・社員の雰囲気に共感いただけたなら、
ぜひ私たちと一緒に働きませんか?
現在、株式会社カサレアルでは事業拡大に伴い、新たな仲間となるエンジニアを積極的に募集しています。

少しでも興味をお持ちいただけましたら、まずは弊社のことを知っていただけると嬉しいです。
▼採用サイト
https://www.casareal.co.jp/recruit/career
▼社員インタビュー
https://hrmos.co/pages/casareal/jobs/0000016
▼エンジニアの仲間になる! エントリーはこちらから
https://hrmos.co/pages/casareal/jobs

皆様のエントリーを心よりお待ちしています!

AIコーディングアシスタント「Claude」を実務で使ってみた感想

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

コメント ※

名前 ※

メール ※

サイト