发布日期:
2026年2月10日
Laravel 版本:
12.51.0
概括
Laravel v12.51.0 添加了通知
afterSending()
回调函数,流畅
whenFails()
和
whenPasses()
验证器(MySQL 查询构建器)上的方法
timeout()
方法和闭包支持
firstOrCreate
和
createOrFirst
用于惰性值评估。此版本还引入了
BatchCancelled
事件、支持在更新查询中将 Eloquent 构建器作为子查询,以及
withoutHeader()
响应方法。
主要亮点包括:
- 通知
afterSending()回调 - 验证者
whenFails()和whenPasses()方法 - MySQL 查询构建器
timeout()方法 - 关闭支持
firstOrCreate/createOrFirst BatchCancelled事件- Eloquent 构建器作为更新查询中的子查询
withoutHeader()关于回应- 改进批量测试并隔离并行测试的缓存
- 修复了大量错误并改进了字体。
什么是新的
通知
afterSending()
回调函数
通知类现在可以定义一个
afterSending
该方法在每个渠道发送通知后运行。它提供了一种便捷的方式来处理发送后的逻辑(例如更新模型或触发事件),而无需注册专用的通知。
NotificationSent
听众:
班级
预订通知
延伸
通知{
民众
功能
__构造
(
民众
预订
$booking) {}
民众
功能
通过
()
:
大批{
返回
[
'邮件'
];}
民众
功能
到邮箱
()
:
邮件信息{
// ...}
民众
功能
发送后
($notifiable, $channel, $response){
$this
->
预订
->
更新
([
'notified_at'
=>
现在
()]);}}
该方法接收可通知实例、频道名称和频道响应,从而为您提供任何后续操作的完整上下文。
拉取请求: #58654
验证者
whenFails()
和
whenPasses()
方法
验证器现在包含流畅的
whenFails()
和
whenPasses()
用于处理验证结果的方法,这在 HTTP 请求周期之外尤其有用——例如在 Artisan 命令或队列作业中:
民众
功能
某种方法
(文件){
验证者
::
制作
([
'文件'
=>
$file],[
'文件'
=>
'required|image|dimensions:min_width=100,min_height=200'
])
->
失败时
(
功能
(){
扔
新的
无效参数异常
(
“提供的文件无效”
(英文):});}
这些方法提供了一种替代手动检查的方法。
$validator->fails()
或者将验证过程封装在 try/catch 代码块中。
拉取请求: #58655
MySQL 查询生成器
timeout()
方法
新的
timeout()
查询构建器上的方法为 MySQL 设置每个查询的执行超时时间。
MAX_EXECUTION_TIME
优化器提示:
学生
::
询问
()
->
在哪里
(
'电子邮件'
,
'喜欢'
,
'%文本%'
)
->
暂停
(
60
)
->
得到
();// 生成:select /*+ MAX_EXECUTION_TIME(60000) */ * from `students` where `email` like ?
您还可以通过全局作用域将其应用为默认值:
使用
照亮\数据库\Eloquent\属性\ScopedBy
;班级
超时范围
实现
范围{
民众
功能
申请
(
建造者
$builder,
模型
$model){$builder
->
暂停
(
60
(英文):}}#[
范围
([
超时范围
::班级
])]班级
用户
延伸
模型{
// ...}
这是 MySQL 特有的,接受以秒为单位的超时值。
拉取请求: #58644
关闭
firstOrCreate
和
createOrFirst
这
firstOrCreate
和
createOrFirst
方法现在接受闭包。
$values
参数,允许对昂贵操作进行惰性求值:
// 之前——昂贵的操作总是运行位置
=
地点
::
询问
()
->
第一个位置
(
'地址'
,$address);如果
($location) {
返回
位置;}返回
地点
::
创造
([
'地址'
=>
$address,
坐标
=>
地理编码器
::
解决
($地址),]);// 之后——地理编码仅在需要新记录时运行位置
=
地点
::
首先或创建
([
'地址'
=>
$address],
fn
() => [
坐标
=>
地理编码器
::
解决
($address)],(英文):
当记录已存在时,闭包永远不会被评估,从而避免不必要的 API 调用、计算或其他昂贵的工作。
拉取请求: #58639
BatchCancelled
事件
新的
BatchCancelled
当批处理作业被取消时,无论取消是由于作业失败自动发生还是通过手动取消调用发生,都会触发此事件。这样,您就可以在整个应用程序中监听批处理作业的取消情况,而无需轮询:
使用
照亮\Bus\Events\BatchCancelled
;使用
照亮\支持\立面\活动
;事件
::
听
(
批次已取消
::班级
,
功能
(
批次已取消
$event) {
日志
::
警告
(
“批 {
$事件
->
批
->
ID
} 被取消了。
(英文):});
拉取请求: #58627
在更新中使用 Eloquent Builder 作为子查询
现在可以直接在更新语句中使用 Eloquent 构建器和关系作为子查询,而无需转换为基本查询:
// 前FooModel
::
在哪里
(
“……”
)
->
更新
([
'bar_id'
=>
条形图
::
在哪里
(
“……”
)
->
到基点
()
->
选择
(
'ID'
),]);// 后FooModel
::
在哪里
(
“……”
)
->
更新
([
'bar_id'
=>
条形图
::
在哪里
(
“……”
)
->
选择
(
'ID'
),]);
这
->toBase()
当将 Eloquent 构建器作为子查询值传递时,不再需要调用。
拉取请求: #58692
withoutHeader()
关于回应
新的
withoutHeader()
该方法允许您从 HTTP 响应中移除标头,从而与现有标头保持一致。
withoutCookie()
方法:
// 删除单个标头返回
回复
(内容)
->
无标题
(
'X-Debug'
(英文):// 删除多个标头返回
回复
(内容)
->
无标题
([
'X-Debug'
,
“X-Powered-By”
,
'服务器'
]);
拉取请求: #58671
错误修复和性能改进
测试:
assertJobs方法PendingBatchFake对于批量作业断言( #58606 )Bus::assertBatched()支持数组( #58659 )viewData()不带键返回所有视图数据TestResponse( #58700 )- 通过缓存前缀隔离实现并行测试
TestCaches特征( #58691 )
HTTP客户端:
throwIfStatus/throwUnlessStatus现在适用于所有状态码,包括 2xx 和 3xx( #58724 )
数据库和 Eloquent:
orderByPivotDesc()降序主元列排序方法( #58720 )whereBetween接受DatePeriod并处理缺失的结束日期( #58687 )- 支持 MySQL 模式转储和加载的 SSL 证书/密钥 ( #58690 )
- 修复自定义模式/连接的 Postgres 序列起始值( #58199 )
- 调整
freshTimestamp对于 SQL Server( #58614 ) - 修复批次计数
deleteWhenMissingModels跳过缺失的模型作业( #58541 )
字符串和辅助函数:
Stringable::deduplicate()接受字符数组( #58649 )- 使固定
Str::substrReplace对于具有负偏移量或长度的极端情况( #58634 ) - 使固定
Str::isUrl()对于单字符域名返回 false( #58686 ) - 代替
substr和mb_substr用于用户代理编码( #58703 )
队列和中间件:
翻译与本地化:
框架及内部结构:
- 在预知请求后恢复原始调度程序绑定 — 修复 Octane 和 Pest ( #58716 )
- 处理二进制数据
Js::encode()调试渲染器( #58618 ) - 向 ArrayObject 添加属性
AsEncryptedArrayObject匹配AsArrayObject( #58619 ) - 修复非主框架的异常页面弹出问题( #58698 )
- 修复 Laravel ASCII SVG 字符对齐问题( #58702 , #58719 )
- 添加弃用标记
Request::get()( #58635 ) - 更新重新加载任务以包含
schedule:interruption( #58637 )





