Skip to main content

前言

Laravel 13 于 2026 年 3 月发布。本指南讲解从 Laravel 12.x 升级到 13.x 的操作步骤。
预计升级时间约 10 分钟。当然,破坏性变更对应用的影响会因规模和所用功能而异。

使用 AI 升级

也可以用 Laravel Boost 自动化升级。Boost 是官方的 MCP 服务器,能为 AI 助手提供分步的升级提示。装到 Laravel 12 应用后,可以在 Claude Code、Cursor、OpenCode、Gemini、VS Code 中通过 /upgrade-laravel-v13 斜杠命令开始升级到 Laravel 13。该命令需要 laravel/boost ^2.0 即便你使用的 AI 工具不支持斜杠命令,也可以直接引用提示词文件,执行相同的升级步骤。把下面的 prompt 原样贴给 AI 即可。
提示词

按影响面分级的变更

影响度:高

  • 依赖更新
  • Laravel installer 更新
  • 请求伪造防御(CSRF)

影响度:中

  • 缓存 serializable_classes 设置
  • Session serialization 设置

影响度:低

  • 缓存前缀与 session Cookie 名
  • 集合模型的序列化
  • Container::call 与 Nullable 类的默认值
  • 域名路由注册的优先级
  • JobAttempted 事件的异常载荷
  • Manager extend 回调的绑定
  • MySQL DELETE 查询(JOIN / ORDER BY / LIMIT)
  • 分页 Bootstrap 视图名
  • 多态 pivot 表名的生成
  • QueueBusy 事件的属性名变更
  • Str factory 在测试间的重置

升级步骤

更新依赖

影响度:高 请更新 composer.json 中的以下依赖。
在使用 Laravel Boost 时也一并更新。
改完之后执行:

更新 Laravel installer

影响度:高 如果你用 Laravel installer CLI 创建新项目,请把它升到兼容 Laravel 13.x 的版本。 composer global require 安装的情况:
在使用 Laravel Herd 的捆绑版本时,请把 Herd 本身升到最新版。

破坏性变更(Breaking Changes)

安全

请求伪造防御

影响度:高 Laravel 的 CSRF 中间件从 VerifyCsrfToken 重命名为 PreventRequestForgery。同时新增了基于 Sec-Fetch-Site 头的请求来源校验。 VerifyCsrfTokenValidateCsrfToken 会作为废弃别名保留,但所有直接引用它们的地方都需要改成 PreventRequestForgery。特别是在测试或路由定义中排除该中间件时要留意。
中间件配置 API 中也可以使用 preventRequestForgery(...)

缓存

影响度:低 Laravel 默认的缓存及 Redis 键前缀现在使用连字符风格的后缀。默认的 session Cookie 名也改为使用 Str::snake(...) 由于大多数应用都会在配置里显式设定值,所以只有依赖框架回退默认值的应用会受影响。
想保留原来的行为,请在 .env 里显式设置。

缓存 serializable_classes 设置

影响度:中 默认的 cache 配置新增了 serializable_classes 选项,默认为 false。这样即使 APP_KEY 泄露,也能防御 PHP 反序列化 gadget 链攻击。 如果你的应用确实在缓存里存 PHP 对象,需要显式把允许反序列化的类列出来。
如果之前是让任意缓存对象反序列化,请改为显式许可列表,或者迁移到非对象的缓存载荷(例如数组)。

Session serialization 设置

影响度:低 Laravel 13 的应用骨架(laravel/laravel)会将 config/session.phpserialization 设置为 json。不过框架内部的默认值仍然是 php
将该设置从 php 改为 json 会使所有活跃用户的 Session 失效。如果应用在 Session 中保存了 PHP 对象,还可能引发错误。
若希望在升级期间保留活跃 Session,请显式将其设为 php。如果应用没有在 Session 中保存 PHP 对象,且能够接受让用户重新登录,可以改为 json 以获得更好的安全性。
启用 JSON 序列化前,请确认应用没有在 Session 中保存 PHP 对象。

容器

Container::call 与 Nullable 类的默认值

影响度:低 Container::call 在没有绑定时会尊重 nullable 类参数的默认值(和 Laravel 12 中构造注入的行为一致)。

数据库

MySQL DELETE 查询

影响度:低 Laravel 现在会为 MySQL 语法编译完整的、带 ORDER BYLIMITDELETE ... JOIN 查询。 以前带 JOIN 的 DELETE 里 ORDER BY / LIMIT 子句会被忽略。Laravel 13 会把这些子句写进生成的 SQL 中。这在不支持该语法的数据库引擎上可能引发 QueryException

Eloquent

多态 pivot 表名的生成

影响度:低 使用自定义 pivot 模型类的多态 pivot 模型在推断表名时,Laravel 会生成复数形式。 如果依赖此前推断出的单数形式表名,请在 pivot 模型里显式定义表名。

集合模型的序列化

影响度:低 Eloquent 模型集合被序列化和恢复(比如推入队列的作业)时,会为模型恢复被 eager 加载的关联。 如果你有代码依赖“反序列化后关联不存在”这一点,需要修改。

队列

JobAttempted 事件的异常载荷

影响度:低 Illuminate\Queue\Events\JobAttempted 事件用 $exception(异常对象或 null)取代了原先的 boolean 属性 $exceptionOccurred

QueueBusy 事件的属性名变更

影响度:低 为了和其他队列事件保持一致,Illuminate\Queue\Events\QueueBusy 事件的属性 $connection 重命名为 $connectionName

路由

域名路由注册的优先级

影响度:低 有明确域名的路由在匹配时会优先于无域名路由。 这样即便无域名路由先注册,catchall 的子域名路由也能一致工作。

支持

Manager extend 回调的绑定

影响度:低 通过 Manager 的 extend 方法注册的自定义驱动闭包会被绑定到 manager 实例上。 如果之前这些回调里的 $this 引用了别的对象(例如服务提供者实例),需要用 use (...) 把它捕获到闭包里。

Str factory 在测试间的重置

影响度:低 Laravel 现在会在测试 teardown 时重置自定义的 Str factory。 如果你依赖自定义 UUID / ULID / 随机字符串 factory 在多个测试之间保持,请在每个相关测试或 setup 钩子中重新配置。

视图

分页 Bootstrap 视图名

影响度:低 Bootstrap 3 默认的内置分页视图名变得更明确。
如果直接引用了旧的分页视图名,请更新。

已废弃的功能


契约新增

影响度:非常低 只对有自定义实现的场景有影响。

Dispatcher 契约

Illuminate\Contracts\Bus\Dispatcher 契约新增了 dispatchAfterResponse($command, $handler = null) 方法。

ResponseFactory 契约

Illuminate\Contracts\Routing\ResponseFactory 契约新增了 eventStream 签名。

MustVerifyEmail 契约

Illuminate\Contracts\Auth\MustVerifyEmail 契约新增了 markEmailAsUnverified()

Queue 契约

Illuminate\Contracts\Queue\Queue 契约新增了以下队列体积检查方法(以前只在 docblock 中声明):
  • pendingSize
  • delayedSize
  • reservedSize
  • creationTimeOfOldestPendingJob

Store / Repository 契约

缓存契约新增了用于延长 TTL 的 touch 方法。

新功能亮点

AI 辅助升级(Laravel Boost)

Laravel Boost 是官方 MCP 服务器。它与 AI 编辑器联动,通过 /upgrade-laravel-v13 命令半自动完成升级。

通过 Sec-Fetch-Site 头做来源校验

PreventRequestForgery 中间件增加了基于 Sec-Fetch-Site 头的来源校验,加固了 CSRF 保护。

安全的缓存反序列化

通过 serializable_classes 设置,只有列入许可的类才会被反序列化。对 PHP 反序列化攻击的安全性得到提升。

SSE(Server-Sent Events)的 eventStream

ResponseFactory 契约新增了 eventStream,改进了 Server-Sent Events 支持。

队列可观测性提升

Queue 契约的 pendingSizedelayedSizereservedSize 等方法让你可以更细粒度地监控队列状态。

常见迁移问题与解决方案

问题:CSRF 相关测试失败

**症状:**引用 VerifyCsrfToken 的测试因“找不到类”而失败。 **解决:**把所有引用都改为 PreventRequestForgery

问题:缓存中的对象无法恢复

**症状:**从缓存取到的数据变成 null,或抛 UnserializationFailedException **解决:**在 config/cache.phpserializable_classes 中加入要使用的类,或把缓存的值转成数组。

问题:JobAttempted 监听器不工作

症状:$event->exceptionOccurred 变成 null 或报未定义错误。 **解决:**改成 $event->exception !== null

问题:session 失效

**症状:**升级后用户被强制登出。 **解决:**默认的 session Cookie 名变了。在 .env 里显式设置 SESSION_COOKIE 以保留原值。

问题:找不到缓存键

**症状:**升级后缓存 miss 增多。 **解决:**缓存前缀变了。在 .env 里设置 CACHE_PREFIX,或清理缓存。

参考资料

最后修改于 2026年8月21日