Laravel 13新機能とバージョン移行準備ガイド|PHP 8.4/8.5要件と年度末アップグレード計画

Laravelニュース・最新情報Laravel入門

「これから登場・普及するLaravel 13ではどのような新機能が追加されるのか?」「現在本番稼働中のLaravel 11やLaravel 12から、いつ・どのタイミングでバージョンアップ計画を立てるべきか?」「PHP 8.4やPHP 8.5への引き上げに伴って、インフラや既存コードにどんな影響があるのか?」と疑問をお持ちではありませんか?

PHPフレームワークのデファクトスタンダードであるLaravelは、毎年第1四半期(Q1)にメジャーバージョンをリリースする年次サイクルを確立しています。その中で登場するLaravel 13は、単なるマイナーな機能追加にとどまらず、「An Agent Ready Framework(AIエージェント対応フレームワーク)」へと大きく舵を切った歴史的なアップデートです。公式AI SDK(laravel/ai)やMCPサーバー統合(Laravel Boost)、Eloquentネイティブのベクトル類似度検索(Vector Similarity Clauses)など、AI時代のWebアプリケーション開発を根底から加速させる革新的な機能が多数搭載されています。

一方で、既存のシステムを保守・運用するテックリードや開発責任者にとって見過ごせないのが「サポート期限(EOL)の到来と年度末(1〜3月)の保守予算サイクル」です。特にLaravel 11はセキュリティサポートを含めた全サポートが終了(EOL)を迎えるため、PHP 8.3〜8.5へのランタイム更新と合わせたアップグレード計画の策定が急務となっています。

📌 本記事で把握・実践できる重要ポイント:

  • Laravel 11 / 12 / 13 のサポートライフサイクル(EOL)早見表と年度末予算計画の立て方
  • Laravel 13が掲げる「An Agent Ready Framework」の設計思想とAI協調開発の仕組み
  • 注目新機能①:Laravel AI SDK & Laravel Boost(MCPサーバー統合・.ai/guidelines)の実装コード
  • 注目新機能②:Vector Similarity Clauses(whereVectorSimilarTo)によるEloquentベクトル検索
  • 注目新機能③・④:JSON:API Resources、Queue Routing、Cache TTL自動延長の実務活用法
  • PHP 8.4(Property Hooks・非対称可視性)およびPHP 8.5の新構文をEloquent・DTOに活かす設計
  • Laravel 11/12からLaravel 13へのバージョン移行完全チェックリストと無停止デプロイ計画

本ガイドでは、次期システム計画を担うテックリード・PM・バックエンドエンジニアの方々に向けて、まずファーストビューでLaravel各バージョンのサポートライフサイクル早見表を提示し、続いてLaravel 13の主要新機能の実装コードから安全なバージョン移行計画まで徹底解説します。

Laravelバージョン 正式リリース時期 バグ修正期限(EOL) セキュリティ修正期限(EOL) 推奨・必須PHPバージョン 現場の移行推奨アクション
Laravel 11 2024年3月 2025年9月(終了) 2026年3月(終了) PHP 8.2 〜 8.3 緊急移行対象(即時12/13へ移行)
Laravel 12 2025年2月 2026年8月 2027年2月 PHP 8.2 〜 8.4 安定稼働中(Laravel 13移行計画策定)
Laravel 13 2026年Q1(正式登場) 2027年8月 2028年2月 PHP 8.3 〜 8.5 新規開発・年度末アップグレード本命
  1. 【早見表】Laravelサポートライフサイクル一覧とLaravel 13の位置づけ
    1. Laravel各バージョンのバグ修正・セキュリティEOLタイムライン(Laravel 11 / 12 / 13)
    2. なぜいまアップグレードが急務となるのか(年度末予算とEOLの背景)
  2. Laravel 13のコンセプト:“An Agent Ready Framework” への大進化
    1. なぜLaravel 13はAIエージェント対応のクリーンスタックと呼ばれるのか
    2. 開発者体験(DX)とAI協調開発のパラダイムシフト
  3. Laravel 13 注目新機能・主要変更点の徹底解説
    1. 【新機能①】Laravel AI SDK & Laravel Boost(MCPサーバー統合・Guidelines)
      1. 1. php artisan boost:install によるMCPサーバー統合と .ai/guidelines
      2. 2. Laravel AI SDKによるMCPツール定義とエージェント実装コード
    2. 【新機能②】Vector Similarity Clauses(Eloquentネイティブのベクトル検索)
      1. 1. マイグレーションでのベクトルカラムとインデックス定義
      2. 2. whereVectorSimilarTo による直感的なセマンティック検索
    3. 【新機能③】JSON:API Resources(仕様準拠レスポンスの自動生成)
    4. 【新機能④】Queue Routing & Cache TTL Extension(基盤性能の強化)
      1. 1. Queue Routing(宣言的なジョブキュー振り分け)
      2. 2. Cache TTL Extension(アクセスに応じたキャッシュ有効期限の柔軟な自動延長)
  4. PHP要件の引き上げ:PHP 8.3 / 8.4 / 8.5 との新構文活用
    1. PHP 8.4 Property Hooks(プロパティフック)と非対称可視性(Asymmetric Visibility)
      1. 1. Property Hooksによる仮想プロパティとバリデーションの簡潔化
      2. 2. 非対称可視性(public private(set))による堅牢なドメイン設計
    2. PHPバージョンアップに伴う互換性チェックとライブラリ依存関係の解決
  5. Laravel 11/12からLaravel 13へのバージョン移行完全チェックリスト
    1. Composer依存関係(composer.json)の更新と非推奨パッケージの洗い出し
    2. 破壊的変更(Breaking Changes)の確認とソースコード修正ポイント
    3. Pest / PHPUnit による自動テスト実行と回帰バグの早期検知
  6. 【現場主導】システムを停止させない年度末アップグレード実践計画
    1. フェーズ分けロードマップ(調査・ステージング検証・本番デプロイ)
    2. Blue-Greenデプロイ / カナリアリリースと万が一のロールバック設計
      1. 1. Expand and ContractパターンによるDB後方互換性の維持
  7. まとめ:次世代Laravelエコシステムへ向けた準備を今すぐ始めよう
    1. 先行キャッチアップがもたらす開発組織の競争優位性
    2. 関連リソース・内部リンク案内
  8. 関連記事

【早見表】Laravelサポートライフサイクル一覧とLaravel 13の位置づけ

Laravelのバージョンアップ計画を立案するうえで、すべての判断基準の土台となるのが公式のサポートライフサイクル(Support Policy)です。LaravelではかつてのLTS(長期サポート版)制度が完全に廃止されており、すべてのメジャーバージョンに対して「リリースから18ヶ月間のバグ修正」と「24ヶ月間(2年間)のセキュリティ修正」が提供される統一ルールで運用されています。

ここでは、Laravel 11・12・13の具体的なサポート期限タイムラインと、なぜ多くの日本企業において年度末に向けたアップグレード計画が急務となるのかを詳しく紐解きます。

Laravel各バージョンのバグ修正・セキュリティEOLタイムライン(Laravel 11 / 12 / 13)

冒頭の早見表で示した通り、現在稼働している主要3バージョンのサポート状況は明確にフェーズが分かれています。特に実務で警戒すべきは、「バグ修正終了(18ヶ月)」と「セキュリティ修正終了(24ヶ月=完全EOL)」の2段階のデッドラインです。

🔍 バージョン別の現在地とリスク評価:

  • Laravel 11(緊急移行フェーズ):2024年3月にリリースされたLaravel 11は、2025年9月にバグ修正が終了し、2026年3月をもってセキュリティ修正を含む全サポートが終了(EOL)します。これ以降にコアフレームワークや依存コンポーネントでゼロデイ脆弱性(SQLインジェクションやリモートコード実行など)が発見されても、公式からパッチは一切提供されません。
  • Laravel 12(保守安定〜移行準備フェーズ):2025年2月にリリースされたLaravel 12は、2026年8月にバグ修正期間を満了し、2027年2月までセキュリティ修正が提供されます。現在安定稼働中ですが、後半の6ヶ月間は重大な脆弱性対応のみのメンテナンスモードに入るため、次期Laravel 13への移行計画を並行して策定する必要があります。
  • Laravel 13(新規開発・次期アップグレードの本命):2026年Q1に登場するLaravel 13は、2027年8月までのバグ修正と、2028年2月までのセキュリティ修正が保証されます。今後の新規プロダクト立ち上げや、Laravel 11/12からの年度末アップグレード先として最も長期間にわたり安全に運用できる本命バージョンです。

もしEOLを迎えたバージョンを本番環境で放置し続けた場合、万が一の不正アクセスや情報漏洩時に「サポート切れのフレームワークを漫然と運用していた」として重大な善管注意義務違反を問われるリスクがあります。また、ISMS(ISO 27001)やプライバシーマーク、PCI DSS(クレジットカード業界のセキュリティ基準)などの監査においても、サポート期間内のミドルウェア・フレームワークを維持していることが必須要件となっているため、計画的なバージョン移行はエンジニアリング組織の最優先事項と言えます。

過去の全バージョン(Laravel 5〜12)にわたるサポート期限の歴史やEOL判断基準については、当サイトの「LaravelのEOL サポートが終了するバージョン一覧とアップグレード手順」および「Laravel 12サポート期限とバージョン移行ガイド」でも詳しく解説しています。

なぜいまアップグレードが急務となるのか(年度末予算とEOLの背景)

なぜ今、多くの開発現場でLaravel 13を見据えたアップグレード計画が活発化しているのでしょうか。その背景には、「技術的なEOLサイクル」と「日本企業特有の年度末(1月〜3月)予算消化サイクル」が完全に重なっているという構造的な理由があります。

【日本企業の保守予算サイクルとLaravelアップグレードの黄金スケジュール】

10月〜12月(Q3:予算策定・事前調査期)
  ├─ 現行システム(Laravel 10/11/12・PHP 8.1/8.2)の棚卸しと依存パッケージ調査
  ├─ 次年度保守予算の枠組み決定・または当年度の余剰保守予算の割り当て
  └─ PHP 8.3/8.4への先行引き上げとステージング環境での事前検証
  │
1月〜3月(Q4:年度末アップグレード実行・検収期)
  ├─ Laravel 11の完全EOL(3月)到来前の駆け込み移行完遂
  ├─ Laravel 13正式リリース(Q1)に合わせた最新基盤へのアップデート
  └─ 年度末検収(3月末)に向けた自動テスト整備・無停止リリース完了

多くの日本企業(3月決算企業)では、10月〜12月にかけて翌年度のIT投資予算やシステム保守計画を策定し、同時に1月〜3月の年度末に向けて「当年度の保守改修予算の消化」や「新年度に向けたインフラ基盤の刷新」を実施します。ちょうどこの毎年1月〜3月(Q1)という時期は、旧バージョンのLaravelがEOLを迎える時期であり、かつ最新メジャーバージョン(Laravel 13)がリリースされる時期とピタリと一致します。

さらに見逃せないのが、PHP本体(ランタイム)のEOL問題です。すでにPHP 8.1はセキュリティサポートが終了しており、多くのLaravel 10/11プロジェクトで採用されてきたPHP 8.2も2026年12月末をもって完全EOLを迎えます。もしフレームワークの更新を先送りにして「Laravel 10 + PHP 8.1」や「Laravel 11 + PHP 8.2」のまま2〜3年放置してしまうと、いざアップデートしようとした際に「PHP自体の破壊的変更」「複数世代分のLaravelコア変更」「サードパーティ製ライブラリの総入れ替え」が一度に押し寄せ、改修工数が通常の3倍〜5倍へと膨れ上がるという「技術的負債の複利爆発」を招いてしまいます。

毎年〜1年半のサイクルで着実にバージョンを引き上げておけば、1回あたりのアップグレード工数は最小限(数日〜数週間)に抑えられます。年度末の予算計画に「LaravelおよびPHPの定期バージョンアップ」を定常タスクとして組み込むことこそが、中長期的な開発コストを最も低く抑える秘訣です。

Laravel 13のコンセプト:“An Agent Ready Framework” への大進化

Laravel 13を語るうえで最も重要なキーワードが、公式が打ち出した“An Agent Ready Framework(AIエージェント対応フレームワーク)”という新しいコンセプトです。

これまでのWebフレームワークは「人間の開発者がいかに書きやすく、読みやすいか」という人間中心の開発者体験(DX)を追求してきました。Laravel 13ではその優れたDXをさらに進化させ、「人間とAIコーディングエージェントが同じコードベース上で最も高い生産性を発揮できるクリーンスタック」へとアーキテクチャを再定義しています。

なぜLaravel 13はAIエージェント対応のクリーンスタックと呼ばれるのか

近年、Cursor、Claude Code、GitHub Copilot、Windsurfなどの自律型AIコーディングエージェントが開発現場の主役となりつつあります。これらのAIエージェントは、単一ファイルのコード補完にとどまらず、複数のファイルを横断してマイグレーションを作成し、Eloquentモデルを定義し、コントローラやAPIリソースを実装し、さらにPestで自動テストを実行して自己修正する能力を持っています。

しかし、フレームワーク側のディレクトリ構造が煩雑であったり、暗黙的な設定ファイルが数十個も散乱していたりすると、AIエージェントのコンテキストウィンドウ(トークン上限)が不要なボイラープレートで埋め尽くされ、「古いバージョンの書き方を混同する(ハルシネーション)」「プロジェクト固有の規約を無視したコードを生成する」という問題が頻発していました。

Laravel 13が「Agent Ready」と呼ばれる理由は、以下の3つのアーキテクチャ特性がAIエージェントの推論メカニズムと完璧に噛み合っているためです。

🤖 Laravel 13が「Agent Ready」である3つの技術的理由:

  1. 極限までスリム化された予測可能な骨格(Skeleton):Laravel 11で導入されLaravel 12/13で完成された bootstrap/app.php 中心のスリム構造により、ルーティング・ミドルウェア・例外ハンドリングのすべてが1ファイルで見通せます。AIエージェントが最小限のファイル読み取りでアプリケーション全体の構造を正確に把握できます。
  2. MCP(Model Context Protocol)によるリアルタイムな自己記述性:後述する「Laravel Boost」を通じて、現在のDBスキーマ、登録済みルート一覧、コンテナのバインディング状況、Artisanコマンド仕様をAIエージェントが直接ツール経由でクエリできます。
  3. プロダクト内へのAIエージェント組み込み(laravel/ai とベクトル検索):「AIを使って開発する」だけでなく、「開発したLaravelアプリ自体が自律型AIエージェントとして動作する」ためのSDKとEloquentベクトル検索がコア機能として統合されています。

Laravel 11で断行されたディレクトリ構造のスリム化(Kernel.php廃止とbootstrap/app.phpへの統合)の基礎については、「Laravel 11の変更点総まとめ|スリム化されたディレクトリ構造・Kernel廃止とbootstrap/app.phpの設定」をあわせて確認しておくと、Laravel 13の設計意図がより深く理解できます。

開発者体験(DX)とAI協調開発のパラダイムシフト

Laravel 13における開発者体験(DX)の進化は、「AI Guidelines(.ai/guidelines)によるチーム開発規約のコード化」に象徴されます。

従来のチーム開発では、コーディング規約やアーキテクチャ方針(例:「サービスクラスの責務」「FormRequestの命名規則」「Eloquentのスコープ設計」など)はNotionやConfluenceなどの外部Wikiに書かれており、新しいメンバーやAIアシスタントがそれらを常に参照することは困難でした。

Laravel 13のエコシステムでは、リポジトリ内の .ai/guidelines/ ディレクトリにフレームワーク標準およびプロジェクト固有のガイドラインを配置し、AIエージェントがコードを生成・リファクタリングする瞬間に「Laravel 13の最新ベストプラクティス」と「自社チームの設計ルール」を自動的にコンテキストへ注入する仕組みが標準化されました。これにより、シニアエンジニアが毎回コードレビューで指摘していた定型的な修正コストが激減し、開発チーム全体のベロシティ(開発速度)とコード品質が同時に跳ね上がるパラダイムシフトが起きています。

Laravel 13 注目新機能・主要変更点の徹底解説

ここからは、Laravel 13で導入・大幅強化される4つの最重要新機能と主要変更点について、実務でそのまま活用できるPHP実装コードとともに徹底解説します。

新機能・強化領域 主な特徴と技術概要 実務での主なユースケース
① Laravel AI SDK & Boost MCPサーバー統合(boost:install)と.ai/guidelinesによるAI駆動開発・マルチLLM統合 AIエージェント開発、社内RAG構築、AIペアプロの精度向上
② Vector Similarity Clauses Eloquent標準のwhereVectorSimilarToによるネイティブベクトル類似度検索 セマンティック検索、レコメンドエンジン、類似ドキュメント抽出
③ JSON:API Resources JSON:API(v1.1)国際標準仕様に完全準拠したレスポンス・複合ドキュメントの自動生成 大規模SPA連携、モバイルアプリAPI、公開REST APIの標準化
④ Queue Routing & Cache TTL 宣言的なジョブキュー振り分けルーティングと、アクセスに応じたキャッシュ有効期限延長 高負荷バッチのワーカー分離、ホットキャッシュのスタンピード防止

【新機能①】Laravel AI SDK & Laravel Boost(MCPサーバー統合・Guidelines)

Laravel 12で登場した公式AIエコシステムは、Laravel 13においてコアワークフローと完全に融合し、さらなる進化を遂げました。特に開発現場で即戦力となるのが、「Laravel Boost」によるMCP(Model Context Protocol)サーバーのワンコマンド統合と、「Laravel AI SDK(laravel/ai)」によるアプリケーション内MCPツール公開・エージェント構築機能です。

1. php artisan boost:install によるMCPサーバー統合と .ai/guidelines

プロジェクトにLaravel Boostを導入してインストーラを実行すると、プロジェクト専用のMCPサーバー設定と、AIエージェント向けのコンテキスト定義ディレクトリ(.ai/guidelines/)が自動的にセットアップされます。

# Laravel Boostと公式AI SDKの導入
composer require laravel/ai
composer require laravel/boost --dev

# MCPサーバー設定とAI Guidelinesの初期化
php artisan boost:install

php artisan boost:install を実行すると、Cursor(.cursor/mcp.json)やClaude Code(.mcp.json)などのAIエディタがLaravelアプリケーションと直接通信できるようになります。同時に生成される .ai/guidelines/ 配下に、チーム固有のアーキテクチャ規約をMarkdown形式で記述しておくことで、AIエージェントは常にそのルールを遵守してコードを生成します。

my-laravel13-app/
├── .ai/
│   └── guidelines/
│       ├── framework-13.md      # Laravel 13標準の最新構文ルール(自動生成)
│       ├── eloquent-vector.md   # ベクトル検索やスコープの実装規約
│       └── team-architecture.md # 自社固有のAction/DTOパターン規約
├── app/
│   └── Ai/
│       ├── Agents/              # アプリ内で稼働するAIエージェントクラス
│       └── Mcp/                 # 外部公開または社内連携用のMCPツール定義
└── bootstrap/
    └── app.php

2. Laravel AI SDKによるMCPツール定義とエージェント実装コード

さらに、開発支援だけでなく「自社のLaravelアプリケーション自体にAIエージェントやMCPツールを組み込む」実装も驚くほどシンプルです。以下は、注文状況の照会ツールを備えたAIエージェントを定義し、コントローラから呼び出す実践的なPHPコード例です。

<?php

namespace App\Ai\Tools;

use App\Models\Order;
use Laravel\Ai\Contracts\Tool;
use Laravel\Ai\Attributes\Description;
use Laravel\Ai\Attributes\Parameter;

#[Description('注文番号から最新の配送ステータスと明細を取得します')]
class LookupOrderStatus implements Tool
{
    public function handle(
        #[Parameter(description: 'ハイフンを含む注文番号(例: ORD-2026-9981)')]
        string $orderNumber
    ): array {
        $order = Order::query()
            ->with('items')
            ->where('order_number', $orderNumber)
            ->firstOrFail();

        return [
            'order_number' => $order->order_number,
            'status'       => $order->status->label(),
            'shipped_at'   => $order->shipped_at?->toIso8601String(),
            'total_amount' => $order->total_amount,
        ];
    }
}

定義したツールは、以下のようにエージェントクラス(App\Ai\Agents\ConciergeAgent)へ登録し、Ai::agent() ファサード経由でストリーミング応答や構造化データ(Structured Output)として即座に実行できます。

<?php

namespace App\Ai\Agents;

use App\Ai\Tools\LookupOrderStatus;
use Laravel\Ai\Contracts\Agent;

class ConciergeAgent implements Agent
{
    public function model(): string
    {
        // config/ai.php で設定したプロバイダ(OpenAI, Anthropic, Gemini等)を指定
        return 'claude-sonnet';
    }

    public function instructions(): string
    {
        return 'あなたはECサイトの専属AIコンシェルジュです。注文番号が提示された場合は必ずLookupOrderStatusツールを実行し、正確な事実のみに基づいて丁寧に回答してください。';
    }

    public function tools(): array
    {
        return [
            LookupOrderStatus::class,
        ];
    }
}

【新機能②】Vector Similarity Clauses(Eloquentネイティブのベクトル検索)

Laravel 13で最も注目を集めているデータベース・ORM機能のひとつが、Eloquentおよびクエリビルダに標準搭載された「Vector Similarity Clauses(ベクトル類似度検索句)」です。

これまでLaravelでRAG(検索拡張生成)やセマンティック検索(意味ベース検索)を実装しようとすると、pgvector 用の外部パッケージを導入したり、whereRaw('embedding <=> ? < ?', [...]) のようなデータベース固有の生SQL(Raw Expression)を手書きしたりする必要がありました。Laravel 13では、これらがEloquentの標準メソッドとして完全に抽象化されています。

1. マイグレーションでのベクトルカラムとインデックス定義

まずはマイグレーションファイルにて、vector カラム(次元数の指定付き)と高速検索用のベクトルインデックス(HNSW等)を直感的に定義できます。

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    public function up(): void
    {
        // PostgreSQLでpgvector拡張を有効化(未有効の場合)
        Schema::ensureVectorExtensionExists();

        Schema::create('articles', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->text('content');
            $table->string('category')->index();
            // 1536次元のベクトル埋め込みカラムを定義
            $table->vector('embedding', dimensions: 1536)->nullable();
            $table->timestamps();

            // コサイン類似度に基づくベクトルインデックスの作成
            $table->vectorIndex('embedding');
        });
    }
};

2. whereVectorSimilarTo による直感的なセマンティック検索

OpenAIや各種埋め込みモデル(Embedding API)で生成したユーザーの検索クエリベクトル($userQueryEmbedding)を渡すだけで、コサイン類似度(Cosine Similarity)の閾値フィルタリングと類似度順のソートを1つのメソッドで完結できます。

<?php

use App\Models\Article;
use Laravel\Ai\Facades\Ai;

// 1. ユーザーの自然言語クエリからEmbedding(ベクトル配列)を生成
$userQueryEmbedding = Ai::embeddings()->generate(
    'Laravelで非同期ジョブの失敗時にSlackへ通知するベストプラクティスは?'
);

// 2. Eloquentネイティブの whereVectorSimilarTo で類似記事を検索
$articles = Article::query()
    ->whereVectorSimilarTo('embedding', $userQueryEmbedding, minSimilarity: 0.8)
    ->take(5)
    ->get();

💡 Vector Similarity Clausesを実務で使うメリット:

  • 通常のEloquent条件とのシームレスな結合:->where('category', 'queue')->where('is_published', true)->whereVectorSimilarTo(...) のように、従来のRDBカラムによる絞り込み(プリフィルタリング)とベクトル検索を自在にメソッドチェーンできます。
  • マルチDBドライバ対応(PostgreSQL pgvector / MySQL 9+ / MariaDB):バックエンドのDBエンジンがPostgreSQL(pgvector)であっても、VECTOR型をネイティブサポートしたMySQL 9+であっても、同じEloquentコードのまま動作します。
  • 類似度スコアの自動付与と並び替え:minSimilarity: 0.8 を指定することで関連性の低いノイズデータを除外し、最も意味の近い上位N件(take(5))を高速に取得できます。

【新機能③】JSON:API Resources(仕様準拠レスポンスの自動生成)

フロントエンド(Next.js、Nuxt、モバイルアプリ)とバックエンドAPIを分離するモダン開発において、APIレスポンス構造の統一は常に議論の種となってきました。Laravel 13では、国際的なRESTful API標準規格である「JSON:API(v1.1仕様)」に完全準拠したレスポンスを自動生成する JsonApiResource が標準サポートされました。

従来の JsonResource では、リソースの type、id、attributes、relationships、そしてN+1問題を防ぎつつ関連データをフラットに同梱する複合ドキュメント(included)の構造を自前で組み立てるか、外部パッケージに頼る必要がありました。Laravel 13の JsonApiResource を使えば、宣言的なメソッド定義だけで仕様準拠のレスポンスが完成します。

<?php

namespace App\Http\Resources;

use Illuminate\Http\Request;
use Illuminate\Http\Resources\JsonApi\JsonApiResource;

class PostJsonApiResource extends JsonApiResource
{
    /**
     * JSON:APIの "type" 識別子を指定
     */
    public function toType(Request $request): string
    {
        return 'posts';
    }

    /**
     * "attributes" オブジェクトに含める属性を定義
     */
    public function toAttributes(Request $request): array
    {
        return [
            'title'        => $this->title,
            'slug'         => $this->slug,
            'published_at' => $this->published_at?->toIso8601String(),
        ];
    }

    /**
     * "relationships" および "included" に展開する関連リソースを定義
     */
    public function toRelationships(Request $request): array
    {
        return [
            'author'   => fn () => UserJsonApiResource::make($this->whenLoaded('author')),
            'comments' => fn () => CommentJsonApiResource::collection($this->whenLoaded('comments')),
        ];
    }
}

このリソースクラスをコントローラから返却すると、以下のような厳格なJSON:APIフォーマット(data, attributes, relationships, included, links)が自動的に構築されます。さらに、クライアント側からの ?include=author,comments や Sparse Fieldsets(?fields[posts]=title,slug)といったクエリパラメータともスムーズに連携できるため、API設計とドキュメント作成の工数を劇的に削減できます。

【新機能④】Queue Routing & Cache TTL Extension(基盤性能の強化)

高トラフィックをさばくエンタープライズシステム向けに、非同期ジョブ基盤(Queue)とキャッシュ機構(Cache)の2大コア機能も大きく強化されています。

1. Queue Routing(宣言的なジョブキュー振り分け)

これまで、ジョブクラスごとに「どのコネクション(Redis / SQS)の、どのキュー名(high / mail / ai-embedding)へ投入するか」を制御するには、各Jobクラスのコンストラクタで $this->onQueue('high') を呼び出すか、ディスパッチ箇所ごとに ProcessPodcast::dispatch()->onQueue('high') と記述する必要があり、設定がコードベース全体に散らばっていました。

Laravel 13の Queue Routing 機能により、bootstrap/app.php やサービスプロバイダ上で、ジョブクラスやインターフェース単位でのルーティングルールを一元管理できるようになりました。

<?php

use App\Jobs\GenerateAiEmbeddingJob;
use App\Jobs\SendTransactionalMailJob;
use App\Contracts\HeavyReportJobInterface;
use Illuminate\Support\Facades\Queue;

// サービスプロバイダまたは bootstrap/app.php での宣言的キュールーティング
Queue::route([
    // 特定のJobクラスを専用キューへルーティング
    GenerateAiEmbeddingJob::class   => ['connection' => 'redis', 'queue' => 'ai-workers'],
    SendTransactionalMailJob::class => ['connection' => 'sqs',   'queue' => 'critical-mail'],

    // 特定インターフェースを実装した全ジョブを低優先度ワーカーへ一括振り分け
    HeavyReportJobInterface::class  => ['connection' => 'redis', 'queue' => 'heavy-reports'],
]);

これにより、ディスパッチ側は単に GenerateAiEmbeddingJob::dispatch($article) と呼ぶだけで、インフラ構成に応じた最適なキューワーカーへと自動的に振り分けられます。キューと非同期ジョブの基礎設計については「Laravel キュー(Queue)と非同期処理の実装完全ガイド」もあわせてご参照ください。

2. Cache TTL Extension(アクセスに応じたキャッシュ有効期限の柔軟な自動延長)

高頻度で参照されるデータ(セッションライクな一時状態、外部APIのトークン情報、トレンド記事の集計結果など)において、「アクセスが続いている間はキャッシュの有効期限(TTL)を自動的に延長(スライディングウィンドウ化)し、アクセスが途絶えたら自然に破棄したい」という要件は頻繁に発生します。

Laravel 13では、Cacheファサードに TTL自動延長・タッチ操作のネイティブサポート が拡充され、データを再計算・再取得することなく低コストでTTLを延長できるようになりました。

<?php

use Illuminate\Support\Facades\Cache;

// 1. キャッシュの有効期限(TTL)のみをアトミックに延長(Redis EXPIRE相当)
// 値をシリアライズし直すことなく、キーの寿命を現在時刻から30分間へ延長
Cache::touch('user_active_workspace:1042', now()->addMinutes(30));

// 2. 取得と同時にTTLをスライディング延長する remember / flexible パターンの活用
$dashboardMetrics = Cache::rememberSliding(
    key: 'org_metrics:55',
    ttl: now()->addMinutes(15),
    callback: fn () => $this->calculateHeavyMetrics(orgId: 55)
);

Redis連携やキャッシュスタンピード対策を含む実践的なキャッシュ設計については、当サイトの「Laravel キャッシュ(Cache)完全ガイド|Redis連携・remember活用・タグ付けとキャッシュスタンピード対策」でさらに掘り下げて解説しています。

PHP要件の引き上げ:PHP 8.3 / 8.4 / 8.5 との新構文活用

Laravel 13へのアップグレード計画において、フレームワーク本体と表裏一体となるのが「PHPランタイム要件(PHP 8.3 〜 8.5)への引き上げ」です。

Laravel 12まではPHP 8.2が最低動作要件として残されていましたが、PHP 8.2本体のEOLに伴い、Laravel 13世代ではPHP 8.3以上(実務推奨はPHP 8.4または最新のPHP 8.5)がターゲット環境となります。このPHPバージョンアップは単なるセキュリティ維持にとどまらず、PHP 8.4 / 8.5で導入された画期的な新構文によってLaravelのモデル(Eloquent)やDTO(Data Transfer Object)の記述を劇的に簡潔化する大きなメリットをもたらします。

PHP 8.4 Property Hooks(プロパティフック)と非対称可視性(Asymmetric Visibility)

PHP 8.4で導入され、PHP 8.5でさらに洗練された2大言語機能が「Property Hooks(プロパティフック)」と「Asymmetric Visibility(非対称可視性:public private(set))」です。これらをLaravel 13のコードベースに取り入れることで、従来の冗長なゲッター・セッターやアクセサ定義が不要になります。

1. Property Hooksによる仮想プロパティとバリデーションの簡潔化

これまで、First NameとLast Nameを結合した full_name のような算出プロパティや、代入時の正規化処理を記述する際には、Attribute::make(get: ..., set: ...) を使ったメソッド定義や、DTO内の専用Getterメソッドが必要でした。PHP 8.4以降の Property Hooks を使えば、プロパティ宣言の中に直接 get / set ロジックをエレガントに記述できます。

<?php

namespace App\DataTransferObjects;

class CustomerProfileDto
{
    public function __construct(
        public string $firstName,
        public string $lastName,
    ) {}

    // 1. Property Hook(get)による仮想プロパティ定義
    // メソッド呼び出しではなく $dto->fullName として直接参照可能
    public string $fullName {
        get => trim("{$this->lastName} {$this->firstName}");
    }

    // 2. Property Hook(set)による代入時の自動正規化・バリデーション
    public string $email {
        set (string $value) {
            $normalized = strtolower(trim($value));
            if (! filter_var($normalized, FILTER_VALIDATE_EMAIL)) {
                throw new \InvalidArgumentException("不正なメールアドレス形式です: {$value}");
            }
            $this->email = $normalized;
        }
    }
}

2. 非対称可視性(public private(set))による堅牢なドメイン設計

もうひとつの革新が非対称可視性(Asymmetric Visibility)です。「クラスの外部からプロパティの値を自由に読み取りたい(public)が、値の書き換えはクラス内部の専用メソッドからのみに制限したい(private(set))」というDDD(ドメイン駆動設計)のエンティティやサービスクラスで頻出する要件を、わずか1行で表現できます。

<?php

namespace App\Services\Billing;

class SubscriptionQuotaState
{
    // 外部からの読み取りは public、書き換え(set)はクラス内部(private)のみに制限
    public private(set) int $usedTokens = 0;

    public function __construct(
        public readonly int $maxTokensLimit,
    ) {}

    public function consume(int $tokens): void
    {
        if ($this->usedTokens + $tokens > $this->maxTokensLimit) {
            throw new \DomainException('月間AIトークン上限を超過しています。');
        }

        // クラス内部からは安全に更新可能
        $this->usedTokens += $tokens;
    }
}

さらに、PHP 8.4で解禁された new MyClass()->method() の括弧省略構文(New without parentheses)や、配列操作の新しい標準関数(array_find(), array_any(), array_all())、そしてPHP 8.5で強化されたパイプ演算子やクロージャ表現は、Laravel 13のマイグレーションファイル(return new class extends Migration)やコレクション処理の可読性を一段と引き上げています。

PHPバージョンアップに伴う互換性チェックとライブラリ依存関係の解決

旧バージョンのPHP(PHP 8.1 / 8.2)からPHP 8.4 / 8.5へランタイムを引き上げる際は、Laravel本体をアップデートする前に「PHP自体の非推奨(Deprecated)警告の解消」と「インフラ・コンテナイメージの更新」を順序立てて行うことが鉄則です。

⚠️ PHP 8.4 / 8.5 引き上げ時に最も多く発生する非推奨警告(Implicitly Nullable Types):

PHP 8.4以降では、function findUser(string $role = null) のように型指定された引数にデフォルト値 null を与えつつ ?string(Nullable型)を明記しない暗黙的Nullable宣言が非推奨(Deprecated)となりました。必ず function findUser(?string $role = null) または string|null $role = null へ修正してください(Laravel Pintを実行することで全自動で一括修正が可能です)。

Docker(Laravel SailやマルチステージDockerfile)およびAWS ECS / EC2環境でのPHPランタイム更新手順は以下の通りです。

# Dockerfile(本番・ステージング用FPMイメージの更新例)
FROM php:8.4-fpm-alpine

# 必須PHP拡張モジュールとRedis / pgvector連携用ドライバの導入
RUN apk add --no-cache \
        postgresql-dev \
        icu-dev \
        libzip-dev \
    && docker-php-ext-install \
        pdo_mysql \
        pdo_pgsql \
        intl \
        zip \
        opcache \
        pcntl \
        bcmath

# Composerのコピーと本番依存パッケージの検証
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer

手元の開発環境と本番サーバーのPHPバージョンが異なることによるデプロイ事故を防ぐため、composer.json の config.platform.php 設定もあわせてターゲットバージョン(例: 8.4.0)に揃えておくことを強く推奨します。

Laravel 11/12からLaravel 13へのバージョン移行完全チェックリスト

ここからは、現在稼働しているLaravel 11またはLaravel 12のプロジェクトを、Laravel 13へ安全に移行するための実践チェックリストをステップバイステップで解説します。

📋 Laravel 13 バージョン移行の全体チェックリスト:

  • Step 1:現在のLaravelバージョン・PHPバージョンの確認(php artisan about)
  • Step 2:composer why-not laravel/framework 13.0 による依存ブロックパッケージの事前特定
  • Step 3:composer.json のフレームワークおよびファーストパーティパッケージのバージョン制約更新
  • Step 4:破壊的変更(Breaking Changes)の確認とソースコード・設定ファイルの修正
  • Step 5:設定キャッシュのクリア(optimize:clear)とPest / PHPUnit自動テストの全面実行

Composer依存関係(composer.json)の更新と非推奨パッケージの洗い出し

いきなり composer.json を書き換えて composer update を叩くと、サードパーティ製ライブラリの依存競合によって大量のエラーメッセージが出力され、原因の特定に時間を奪われがちです。

熟練のテックリードが必ず最初に実行するのが、composer why-not(prohibits)コマンドによるブロッカーの事前洗い出しです。

# 1. 現在の環境情報を確認
php artisan about

# 2. Laravel 13.0へのアップグレードを阻害しているパッケージを一覧表示
composer why-not laravel/framework 13.0

# 3. 導入済みパッケージの最新バージョン状況を一覧確認
composer outdated --direct

composer why-not laravel/framework 13.0 を実行すると、「どのサードパーティパッケージが illuminate/support: ^11.0|^12.0 に固定されているか」がピンポイントで判明します。該当するパッケージの最新リリースを確認し、composer.json を以下のようにLaravel 13対応版へと更新します。

{
    "require": {
        "php": "^8.3",
        "laravel/framework": "^13.0",
        "laravel/ai": "^1.0",
        "laravel/sanctum": "^4.0",
        "laravel/tinker": "^2.10"
    },
    "require-dev": {
        "fakerphp/faker": "^1.24",
        "laravel/boost": "^1.0",
        "laravel/pail": "^1.2",
        "laravel/pint": "^1.21",
        "laravel/sail": "^1.41",
        "mockery/mockery": "^1.6",
        "nunomaduro/collision": "^8.6",
        "pestphp/pest": "^3.7",
        "pestphp/pest-plugin-laravel": "^3.1",
        "phpunit/phpunit": "^11.5"
    }
}

編集が完了したら、依存パッケージのツリー全体を再計算してアップデートを実行します。

# 依存ツリーの関連ライブラリを含めて一括アップデート
composer update --with-all-dependencies

破壊的変更(Breaking Changes)の確認とソースコード修正ポイント

Laravel 11またはLaravel 12からLaravel 13へ移行する際、特に重点的に確認・修正すべき破壊的変更(Breaking Changes)のポイントは以下の通りです。

確認カテゴリ 影響度 主な変更内容と修正アクション
PHP最低要件と型宣言 高(必須) PHP 8.3以上が必須。PHP 8.4/8.5利用時は暗黙的Nullable型(Type $arg = null)を ?Type $arg = null へ修正。
Carbon 3.x 完全準拠 中(Laravel 11からの場合) Laravel 11から直接13へ飛び級移行する場合、Carbon 2は完全廃止。diffIn* メソッドの戻り値(浮動小数点・符号)の挙動を確認。
画像バリデーション(SVG) 中(Laravel 11からの場合) image ルールからSVGが除外済み。SVGアップロードを許可する箇所は mimes:jpeg,png,svg を明示。
カスタムArtisanコマンドとスケジュール 低〜中 Symfony Console 7.x系の厳格な戻り値型(int / Command::SUCCESS)への準拠と、routes/console.php でのスケジュール定義を確認。

特にLaravel 11からLaravel 13へ2世代分のアップグレードを行う場合は、Laravel 12時点で導入された変更点(Carbon 3の厳格化やSVGバリデーション変更など)も同時に適用されます。Laravel 12における変更点の詳細は「Laravel 12の新機能・変更点総まとめ」でコード付きで解説しているため、あわせてチェックしておくと漏れがありません。

また、自社で独自に作成しているバッチ処理(Artisanコマンド)がある場合は、Symfony Consoleの型仕様変更に伴って handle() メソッドのシグネチャやオプション取得処理に警告が出ないか確認しておきましょう。Artisanコマンドの最新設計パターンについては「Laravel Artisanコマンド自作と引数・オプション設計完全ガイド|バッチ処理・進捗表示・並行実行の実装」が参考になります。

Pest / PHPUnit による自動テスト実行と回帰バグの早期検知

バージョン移行において「アップグレード工数を80%以上削減できるかどうか」の分水嶺となるのが、PestまたはPHPUnitによる自動テストスイートの有無です。

手動で画面をポチポチとクリックして確認する人海戦術のテストでは、フレームワーク内部の微妙な型変更やシリアライズ仕様の変更によるバグ(回帰バグ・デグレ)を網羅的に見つけることは不可能です。逆に、主要なAPIエンドポイントとビジネスロジックに対するFeatureテストが揃っていれば、php artisan test を1回走らせるだけで数分以内にすべての非互換箇所を特定できます。

# 1. 古い設定・ルート・ビュー・イベントキャッシュを完全クリア
php artisan optimize:clear

# 2. Laravel PintによるPHP 8.4/8.5構文整形(Nullable型等の自動修正)
./vendor/bin/pint --test

# 3. 並列実行(--parallel)で全テストスイートを高速検証
php artisan test --parallel

さらに、GitHub ActionsなどのCIパイプラインにおいて、「PHP 8.3 / 8.4 / 8.5」×「Laravel 12 / 13」のマトリクステスト(Matrix Strategy)を移行期間中に並行稼働させることで、既存のメインブランチを壊すことなく段階的にLaravel 13対応を進めることができます。

# .github/workflows/tests.yml(移行期間中のマトリクスCI構成例)
name: Laravel Upgrade Matrix Tests

on: [push, pull_request]

jobs:
  laravel-tests:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        php: ['8.3', '8.4', '8.5']
        laravel: ['^12.0', '^13.0']
    steps:
      - uses: actions/checkout@v4

      - name: Setup PHP ${{ matrix.php }}
        uses: shivammathur/setup-php@v2
        with:
          php-version: ${{ matrix.php }}
          extensions: mbstring, xml, ctype, json, bcmath, pdo_pgsql

      - name: Install Dependencies
        run: |
          composer require "laravel/framework:${{ matrix.laravel }}" --no-interaction --no-update
          composer update --prefer-dist --no-interaction

      - name: Execute Pest / PHPUnit
        run: php artisan test --parallel

【現場主導】システムを停止させない年度末アップグレード実践計画

ミッションクリティカルなBtoB SaaSや大規模ECサイトにおいて、「フレームワークのバージョンアップのために数時間のサービス停止(メンテナンス画面表示)を行う」ことはビジネス上の大きな機会損失につながります。

ここでは、年度末のアップグレードプロジェクトを無停止(ゼロダウンタイム)かつ安全に完遂させるためのフェーズ分けロードマップと、Blue-Greenデプロイ・ロールバック設計の実践ノウハウを公開します。

フェーズ分けロードマップ(調査・ステージング検証・本番デプロイ)

失敗しないアップグレード計画の鉄則は、「機能開発(新機能の追加)」と「基盤アップグレード(PHP・Laravelの引き上げ)」を絶対に同じプルリクエスト・同じリリースに混ぜないことです。以下の3フェーズ(合計約1.5〜2ヶ月)に分けて段階的に進めるロードマップを推奨します。

フェーズ 想定期間 実施する主要タスクと完了条件(Exit Criteria)
第1フェーズ
(事前調査・依存解決)
約1ヶ月 ・composer why-not による非互換パッケージの特定と代替選定
・不足している重要機能(決済・認証・バッチ)のPestテスト追加
・PHP 8.4/8.5環境での非推奨(Deprecated)警告の先行修正とマージ
第2フェーズ
(ステージング検証・E2E)
2〜3週間 ・専用ブランチでのLaravel 13引き上げとCIマトリクステスト通過
・ステージング環境へのデプロイと外部連携(Stripe/S3/メール/OAuth)の実通信検証
・Queueワーカーおよび定期バッチ(Scheduler)の24時間連続稼働モニタリング
第3フェーズ
(本番リリース・監視)
1日(当日) ・Blue-Greenデプロイまたはカナリアリリースによるトラフィック段階切り替え
・旧ワーカーのGraceful Shutdown(queue:restart)と新ワーカーの起動
・エラートラッキング(Sentry / Bugsnag / Laravel Nightwatch)の集中監視

Blue-Greenデプロイ / カナリアリリースと万が一のロールバック設計

本番リリースの当日(第3フェーズ)において、サービスを1秒も止めずにLaravel 13環境へ切り替えるためには、「Blue-Greenデプロイメント(またはカナリアリリース)」と「後方互換性を維持したDBマイグレーション(Expand and Contractパターン)」の2つを組み合わせます。

1. Expand and ContractパターンによるDB後方互換性の維持

もしLaravel 13へのアップグレードと同時にデータベースのカラム名変更や削除(Destructive Migration)を行ってしまうと、万が一新環境で不具合が見つかって旧環境(Blue:Laravel 12)へ切り戻した(ロールバックした)瞬間に、旧コードが存在しないカラムを参照して全面的な500エラーを引き起こします。

🛡️ 安全なロールバックを保証する3つの鉄則:

  1. DBスキーマの変更は「追加(Expand)」のみに留める:例えばベクトル検索用の embedding カラムを追加する場合、必ず ->nullable() として追加します。これにより、旧バージョン(Blue)と新バージョン(Green)の両方のコンテナが同じDBに同時接続してもエラーが発生しません。
  2. セッション・キャッシュ・キューのシリアライズ互換性を確認する:Redisを共有している場合、新旧コンテナ間でセッションやジョブペイロードのデシリアライズエラーが起きないよう、キャッシュプレフィックス(CACHE_PREFIX)を世代ごとに分けるか、移行直前にキューを空に近い状態(Drain)にしてから php artisan queue:restart を実行します。
  3. ALB / ロードバランサのターゲットグループ切り替えで5秒以内にロールバック可能にする:AWS ECSやKubernetes上で新環境(Green:PHP 8.4/8.5 + Laravel 13)のタスク群を立ち上げ、まずは10%のカナリアトラフィックを流して異常がないことを確認したうえで100%へ切り替えます。万が一の異常検知時は、ロードバランサの重み付けをBlue(旧環境)へ戻すだけで即座に無停止ロールバックが完了します。

まとめ:次世代Laravelエコシステムへ向けた準備を今すぐ始めよう

本記事では、Laravel 13の注目新機能(Laravel AI SDK、Laravel Boost、Vector Similarity Clauses、JSON:API Resources、Queue Routing、Cache TTL Extension)から、PHP 8.4 / 8.5の新構文活用、そして年度末に向けた安全なバージョン移行チェックリストと無停止デプロイ計画までを体系的に解説しました。

先行キャッチアップがもたらす開発組織の競争優位性

フレームワークのアップグレードを「やらなければならない面倒な保守作業」と捉えるか、「開発チームの生産性とプロダクトの競争力を飛躍させる投資」と捉えるかで、1〜2年後のエンジニアリング組織には決定的な差が生まれます。

🚀 Laravel 13への早期移行がもたらす3つの組織的メリット:

  • 1. AIネイティブ機能(RAG・エージェント・ベクトル検索)の超高速な市場投入:laravel/ai や whereVectorSimilarTo がフレームワーク標準となったことで、他社が数ヶ月かけて構築するAI機能をわずか数日で本番プロダクトへ実装できます。
  • 2. AIコーディングエージェントとの協調による開発ベロシティの倍増:Laravel Boost(MCP)と .ai/guidelines を整備することで、AIエージェントによるコード生成・テスト作成の精度が劇的に向上し、少人数チームでも圧倒的な開発スピードを実現できます。
  • 3. 優秀なエンジニアの採用競争力と定着率の向上:常にモダンなPHP 8.4/8.5と最新のLaravel環境を維持している技術組織は、成長意欲の高いシニアエンジニアにとって極めて魅力的な環境として映ります。

まずは手元の開発環境で php artisan about と composer why-not を実行し、現行システムの棚卸しと年度末アップグレード計画の第一歩を今日から踏み出しましょう。

関連リソース・内部リンク案内

Laravelのサポート期限(EOL)の確認や、過去のメジャーバージョン変更点、実践的なArtisanバッチ処理の設計については、以下の関連記事もあわせてご活用ください。

レン (Wren)

こんにちは。レンです。

Laravelのコードの森に住んでいる、小さな案内役です。
ルーティングの枝やクラスの影を歩きながら、コードの流れや仕組みを眺めています。

このサイトでは、Laravelの基本から実装のコツまで、開発で役立つポイントを静かに整理しています。
難しいことを増やすのではなく、コードの見通しが少し良くなるヒントを届けるのが役目です。

「この処理はどこに書くのがいいのか」
「Laravelではどう考えると整理できるのか」

そんな疑問に、小さなメモを残すような気持ちで記事を書いています。

コードを書いている途中で迷ったとき、
このサイトが少し立ち止まって整理できる場所になればうれしいです。

レン (Wren)をフォローする

コメント