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 是一种安全方法,可以携带请求体:

php
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() 方法:

php
// 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() 方法现在接受一个可选的上下文数组:

php
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 将连接参数移到最后,并默认使用默认连接:

php
// 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() 在分页过程中会改变查询构造器的状态。之后复用同一个构造器会得到错误的结果:

php
$query = User::query();
 
foreach ($query->lazy(2) as $user) {
    // ...
}
 
$query->count(); // 在 Laravel 13 中返回 0

Jack Bayliss 在 #61411 和 #61428 中修复了这两个方法,因此在 Laravel 14 中 count() 将返回完整的行数。

findOr() 支持传入 ID 数组 ​

此前当传入 ID 数组时,Builder::findOr() 从不会调用其回调。Matthieu 提交的 #61577 使其行为与 findOrFail() 以及关联关系(relation)版本的 findOr() 保持一致:

php
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:

php
Cache::put('foo', 'bar');
 
Cache::has(['foo', 'missing']);
 
// Laravel 13:true
// Laravel 14:false

向 forget() 传入数组会删除每一个键,并且只有当所有键都被成功删除时才返回 true:

php
Cache::forget(['foo', 'baz']);
 
// Laravel 13:键仍然存在,Redis 存储还会发出
// "Array to string conversion" 警告
// Laravel 14:两个键都被删除

MassPrunable 会包含软删除的模型 ​

当模型使用软删除时,Prunable trait 会在 prune 查询中附加 withTrashed(),但 MassPrunable 之前没有这样做。#61425 使两者行为一致。以一个同时使用这两个 trait 的模型为例:

php
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 修复截止安全修复截止
118.2 - 8.42024 年 3 月 12 日2025 年 9 月 3 日2026 年 3 月 12 日
128.2 - 8.52025 年 2 月 24 日2026 年 8 月 13 日2027 年 2 月 24 日
138.3 - 8.52026 年 3 月 17 日2027 年第三季度2028 年 3 月 17 日
148.4+2027 年第一季度2028 年第三季度2029 年第一季度

注:官方文档尚未列出 Laravel 14,正式细节有待确认。

2026 年 3 月 17 日发布的 Laravel 13 将继续获得:

  • 截至 2027 年第三季度的 bug 修复
  • 截至 2028 年 3 月 17 日的安全修复

Laravel 12 已不再获得 bug 修复,其安全修复将于 2027 年 2 月 24 日结束。

本作品采用《CC 协议》,转载必须注明作者和本文链接