
laravel-news.comは2026年9月21日付の記事で、Laravel 14に向けて現在masterブランチにマージ済みの変更点をプルリクエスト単位でまとめている。Laravel 14は2027年第1四半期のリリースを想定し、PHP 8.4を最小要件とする。リリース日と正式な機能リストは未発表であり、内容は今後の開発で變動する前提である。本稿ではマージ済みの主なPRを挙動ベースで整理し、Laravel 13系で稼働中のプロジェクトが事前点検すべき項目を抽出する。
サポートサイクルと前提環境
Laravel 14はLaravelの標準サポートサイクルに従い、バグ修正を2028年第3四半期まで、セキュリティ更新を2029年第1四半期まで提供する。すなわち本番運用でのサポート窓はおよそ2年ある計算になる。当面の新機能はLaravel 13の週次マイナーリリースで継続提供され、契約へのメソッド追加やシグネチャ変更を含むものはLaravel 14へ持ち越される設計である。13系から段階的に上げる個人開発者にとって、メジャーバージョン間の差分を早期に把握しておく価値は高い。Laravel 13の現行挙動とLaravel 14の新挙動の差分をテストの前提として固定する形で事前検証するのが妥当である。
主な変更点
masterブランチにマージ済みの主なPRを挙動ベースで抜粋する。各項はPR番号と起票者、13系から見た挙動変化、14での新挙動の三点で構成する。
HTTP QUERYメソッド対応(PR #60655、Vazha Aptsiauri)
Route::anyがQUERYメソッドを含むようになり、CSRFミドルウェアはGET・HEAD・OPTIONSと同様に読み取り扱いとする。QUERYはボディを伴う安全メソッドとして定義される。Laravel 13.19で追加済みのHttp::queryとテストヘルパーに続く、ルーティング層への統合である。スコープはルーティング層とCSRFミドルウェアに限定され、コントローラ側の分岐は既存実装がそのまま動く。
authorizeメソッド追加(PR #59708、Will Rowe)
Authorizable契約とトレイトにauthorizeが加わり、$user->canと同等の判定で失敗時にAuthorizationExceptionを送出する。return $user->can(...)のようなboolean分岐を書かずに、ポリシーの可否を直接表明する記述が可能になる。既存のcan実装は並行して残り、移行は段階的に行える。
例外報告のコンテキスト対応(PR #60767、Caleb White)
reportヘルパーと例外ハンドラのreportはオプションのcontext配列を受け付ける。
public function report(Throwable $e, array $context = []): void;カスタム実装でreportをオーバーライドしている箇所は新パラメータへの対応が必須となる。本PRはメソッドシグネチャの変更を伴うため13系には取り込まれず、14で適用される。
キューAPIの引数順変更(PR #61076)
Laravel 13.25で全キューの一時停止が追加され、per-queueメソッドはconnectionを第1引数に要求していた。本PRでconnectionは末尾に移動し、未指定時はデフォルト接続に解決される。
// Laravel 13.25: 第1引数=connection(必須)
// Laravel 14: connection は末尾に、オプション
Queue::resume('emails'); // デフォルト接続
Queue::resume('emails', 'redis'); // 明示
Queue::isPaused('emails'); // 第1引数はキュー名resumeおよびisPausedも同様に第1引数がキュー名、オプション第2引数がconnectionとなる。connection指定必須の書き方から、queue名中心の自然な記述に移行する。
クエリビルダlazy/chunkのcount修正(PR #61411, #61428、Jack Bayliss)
13ではpaginate実行後にビルダーを再利用するとcountが不正確になる。14ではビルダー状態が復元され、全件数が返る。lazy/chunkは内部でクエリを書き換えるため、後続のcount呼び出しでは別意図のページング結果を見る挙動が解消される。
Cache::has/forgetの配列対応(PR #61466、Jack Bayliss)
// 13: Cache::has(['a','b']) は常に true、forget も削除しない
// 14: 全キー存在時のみ true、全削除成功時のみ true
Cache::has(['a', 'b']);
Cache::forget(['a', 'b']);4年間にわたってドキュメントと実装が不一致だった配列引数の挙動が揃う。テストが暗黙にこの挙動に依存していた場合は修正候補となる。
Builder::findOrのコールバック不発修正(PR #61577、Matthieu)
配列IDを渡してもコールバックが呼ばれない不具合が解消され、findOrFailおよびリレーション版のfindOrと挙動が揃う。findOrとfindOrFailの挙動差分が一律に解消されることで、nullフォールバックを意図したコードの分岐が単純になる。
whereKey群の統合とサブクエリ対応(PR #61395, #61496、Caleb White)
whereKey/whereKeyNotを統合し、or版を追加。4メソッドともサブクエリを引数に取れる。
Model::whereKey($subquery)->get;
Model::orWhereKeyNot($ids)->get;Eloquentの主キー指定系APIが一貫した引数規約になる。
Storage::fake('ondemand')追加(PR #61378)
既存のondemandというディスク名と衝突し得るためmasterに直接マージされた。Storage::build呼び出しもintercept対象となり、名前付きディスクと同等のアサーションでオンデマンドディスクをテストできる。テストフィクスチャのディスク指定がStorage::fakeの引数のみで完結する。
Prunableトレイトの整合(PR #61425)
softDeletes併用モデルのPrunableでwithTrashedが効くようになり、MassPrunableと挙動が揃う。artisan model:pruneで論理削除済みレコードも削除対象になる。トレイト併用時の暗黙の前提が崩れるため、pruneジョブの実行結果と削除ログをCIで再確認する価値がある。
既存プロジェクトの確認項目
Laravel 13系で稼働中のプロジェクトは14への移行を想定し、以下を点検する。各項目は検出コマンドまたは目視の範囲で洗い出せる粒度に統一した。
- カスタム例外ハンドラのreport(Throwable $e)オーバーラIDE → report(Throwable $e, array $context = [])への追従。
- Queueファサードのresume/isPaused呼び出し → 「connection, queue」順で記述されている箇所は引数順を入れ換える。
- lazy/chunk後のビルダー再利用 → countが実数となるため影響テストを事前に確認する。
- Cache::has/forgetへの配列渡し → 14の挙動を前提としたテストへ更新する。
- PrunableとMassPrunable併用モデル → model:pruneの実行結果が変わるため削除対象レコードを精査する。