Laravel 14 目前已知的全部信息
Laravel 14 是 Laravel 框架的下一个大版本,预计于 2027 年第一季度发布。该版本将要求 PHP 8.4 作为最低版本,并遵循 Laravel 标准的支持周期:bug 修复持续到 2028 年第三季度,安全更新持续到 2029 年第一季度。
Laravel 团队尚未公布发布日期或功能清单。以下所有内容均来自 laravel/framework 的 master 分支——Laravel 14 的开发就在该分支上进行——其中任何内容在正式发布前都可能发生变化。
新特性
Laravel 14 的特性将在正式公布后陆续补充到本文中。大多数新功能仍然通过 Laravel 13 的每周小版本发布,而下述特性之所以要等到 Laravel 14,是因为它们会向契约(contract)添加方法或改变方法签名。
Route::query()
Vazha Aptsiauri 提交的 #60655 为路由增加了对 HTTP QUERY 方法的支持。QUERY 是一种安全方法,可以携带请求体:
Route::query('/search', function () {
return request()->input('filter');
});Route::any() 会包含 QUERY 方法,CSRF 中间件将其视为只读请求,与 GET、HEAD 和 OPTIONS 的处理方式相同。
Laravel 13.19 已经为 HTTP 客户端添加了 Http::query(),以及 query() 和 queryJson() 测试辅助方法。
如果还在使用 Laravel 13,可以参考关于使用 Scout 搜索实现 HTTP QUERY 方法的教程。
$user->authorize()
Will Rowe 在 #59708 中为 Authorizable 契约和相应 trait 添加了 authorize() 方法:
// Laravel 13
Gate::forUser($user)->authorize('viewAny', Post::class);
// Laravel 14
$user->authorize('viewAny', Post::class);它的行为与 $user->can() 类似,但在检查失败时会抛出 AuthorizationException。
report() 支持上下文参数
由 Caleb White 在 #60767 中添加,report() 辅助函数和异常处理器的 report() 方法现在接受一个可选的上下文数组:
try {
$order->charge();
} catch (Throwable $e) {
report($e, ['order_id' => $order->id]);
}ExceptionHandler 契约随之变更为 report(Throwable $e, array $context = []),因此重写了 report() 的自定义处理器需要加上这个新参数。
针对按需磁盘的 Storage::fake()
Storage::fake('ondemand') 会拦截 Storage::build() 调用,因此可以像测试命名磁盘一样,使用相同的断言来测试按需创建的磁盘(#61378)。该 PR 被提交到 master 分支,原因是应用中可能已经存在名为 ondemand 的磁盘。
whereKey() 支持子查询,并新增 orWhereKey()
Caleb White 在 #61395 中整合了 whereKey() 和 whereKeyNot(),并新增了 orWhereKey() 和 orWhereKeyNot()。随后在第二个 PR #61496 中,这四个方法全部支持传入子查询。
破坏性变更
队列暂停方法将队列参数提前
Laravel 13.25 增加了暂停全部队列的能力,Queue 门面上的按队列操作方法要求将连接名作为第一个参数。#61076 将连接参数移到最后,并默认使用默认连接:
// Laravel 13
Queue::pause('redis', 'emails');
Queue::pauseFor('redis', 'emails', 60);
// Laravel 14
Queue::pause('emails');
Queue::pauseFor('emails', 60);
Queue::pause('emails', 'redis');resume() 和 isPaused() 同样改为队列名在前、连接名作为可选的第二个参数。
lazy() 和 chunk() 不再修改查询构造器
在 Laravel 13 中,lazy() 和 chunk() 在分页过程中会改变查询构造器的状态。之后复用同一个构造器会得到错误的结果:
$query = User::query();
foreach ($query->lazy(2) as $user) {
// ...
}
$query->count(); // 在 Laravel 13 中返回 0Jack Bayliss 在 #61411 和 #61428 中修复了这两个方法,因此在 Laravel 14 中 count() 将返回完整的行数。
findOr() 支持传入 ID 数组
此前当传入 ID 数组时,Builder::findOr() 从不会调用其回调。Matthieu 提交的 #61577 使其行为与 findOrFail() 以及关联关系(relation)版本的 findOr() 保持一致:
User::findOr([1, 99], fn () => 'fallback');
// Laravel 13:返回只包含用户 1 的 Collection
// Laravel 14:返回 'fallback'Cache::has() 和 Cache::forget() 支持数组
has() 和 forget() 的文档注释四年来一直声明支持数组,但 Cache::has(['a', 'b']) 始终返回 true,而 Cache::forget(['a', 'b']) 并不会真正删除这些键。Jack Bayliss 在 #61466 中修复了这两个方法。在 Laravel 14 中,只有当所有键都存在时 has() 才返回 true:
Cache::put('foo', 'bar');
Cache::has(['foo', 'missing']);
// Laravel 13:true
// Laravel 14:false向 forget() 传入数组会删除每一个键,并且只有当所有键都被成功删除时才返回 true:
Cache::forget(['foo', 'baz']);
// Laravel 13:键仍然存在,Redis 存储还会发出
// "Array to string conversion" 警告
// Laravel 14:两个键都被删除MassPrunable 会包含软删除的模型
当模型使用软删除时,Prunable trait 会在 prune 查询中附加 withTrashed(),但 MassPrunable 之前没有这样做。#61425 使两者行为一致。以一个同时使用这两个 trait 的模型为例:
use Illuminate\Database\Eloquent\MassPrunable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Post extends Model
{
use MassPrunable, SoftDeletes;
public function prunable()
{
return static::where('created_at', '<=', now()->subMonth());
}
}在 Laravel 13 中,model:prune 会强制删除匹配且未被软删除的文章,软删除的文章则保留在表中。在 Laravel 14 中,它会强制删除所有匹配的文章,包括已软删除的。
如果在软删除模型上使用 MassPrunable,请检查 prunable() 查询是否仍然筛选出预期的行。若要保留 Laravel 13 的行为,可以在查询中加上 withoutTrashed()。
PHP 版本要求
Laravel 14 将要求 PHP 8.4 作为最低版本,较 Laravel 13 的 PHP 8.3 最低要求有所提升。在 #59104 中,Laravel 14 将最低版本提高到 PHP 8.4,原因是 Symfony 8 要求 PHP 8.4 作为最低版本。
Laravel 同样兼容更新版本的 PHP。关于该版本其余的新内容,参见《PHP 8.6 新特性》。
master 分支上其他可能随 Laravel 14 落地的依赖变更:
- ably/ably-php 升级到使用 Ably 协议 2.0 的版本(#60860)
- orchestra/testbench-core 升级到 ^12.0
- 同时支持 PHPUnit 11.5、12.5 和 13
支持时间线
Laravel 的支持政策规定,大版本每年在第一季度前后发布。按照该政策,Laravel 14 的 bug 修复将持续到 2028 年第三季度,安全更新将持续到 2029 年第一季度:
| 版本 | PHP (*) | 发布时间 | Bug 修复截止 | 安全修复截止 |
|---|---|---|---|---|
| 11 | 8.2 - 8.4 | 2024 年 3 月 12 日 | 2025 年 9 月 3 日 | 2026 年 3 月 12 日 |
| 12 | 8.2 - 8.5 | 2025 年 2 月 24 日 | 2026 年 8 月 13 日 | 2027 年 2 月 24 日 |
| 13 | 8.3 - 8.5 | 2026 年 3 月 17 日 | 2027 年第三季度 | 2028 年 3 月 17 日 |
| 14 | 8.4+ | 2027 年第一季度 | 2028 年第三季度 | 2029 年第一季度 |
注:官方文档尚未列出 Laravel 14,正式细节有待确认。
2026 年 3 月 17 日发布的 Laravel 13 将继续获得:
- 截至 2027 年第三季度的 bug 修复
- 截至 2028 年 3 月 17 日的安全修复
Laravel 12 已不再获得 bug 修复,其安全修复将于 2027 年 2 月 24 日结束。