Laravel 10.20 发布
发布于 作者 Paul Redmond
本周,Laravel 团队发布了 v10.20,其中包含 createOrFirst()
方法、基准测试单个可调用函数、新的响应 JSON 断言等等
Eloquent createOrFirst() 方法
Tony Messias 贡献了 createOrFirst()
方法,该方法尝试创建一个新记录。如果出现唯一约束冲突,此方法将尝试查找匹配的记录
$result = Model::createOrFirst( ['name' => 'Example User'] // values merged with attributes if created);
即使没有软删除,也使用被删除的关系
Mior Muhammad Zaki 做了一些更新,支持在多态关系上使用 withTrashed()
、withoutTrashed()
、onlyTrashed()
这在一些第三方包中很有用,因为这已经成为一个问题,因为无法定义这样的关系 $this->morphTo()->withTrashed(),除非所有关系都使用 SoftDeletes 特性...
您可以在 Pull Request #47880 的描述中了解有关此更改的更多信息。
对单个可调用函数进行基准测试并获取结果
Tim MacDonald 为基准测试实用程序类贡献了 value()
方法,您可以使用它来测量给定可调用函数的内联并获取结果值
public function list(){ [$response, $duration] = Benchmark::value( fn () => Http::get('https://external-service.com/list.json') ); if ($duration > 1000) { Log::warning('external-service.com is running slow'); } return $response->json();}
将数据合并到 API 资源时允许使用默认值
Choraimy Kroonstuiver 贡献了向 mergeWhen()
传递默认值的能力,该值将被使用。当您想要提供默认值时,这将清理 mergeWhen()
和 mergeUnless
周围的逻辑
这是来自 pull request 的示例,展示了在 Laravel 10.20 之前如何执行此操作
class MyResource extends JsonResource{ public function toArray($request): array { return [ /* other properties */ $this->mergeWhen($this->hasSpecificData(), $this->specificData()), $this->mergeUnless($this->hasSpecificData(), static::genericData()), ]; }}
现在您可以这样做
class MyResource extends JsonResource{ public function toArray($request): array { return [ /* other properties */ $this->mergeWhen($this->hasSpecificData(), $this->specificData(), static::genericData()), ]; }}
规范 JSON 路径断言
Günther Debrauwer 贡献了 assertJsonPathCanonicalizing()
方法,您可以使用它来检查 JSON 响应是否包含所有预期的值,而没有给定的顺序。
$users = User::factory()->count(2)->create(); $response = $this->get('/api/users');$response->assertJsonPathCanonicalizing( 'data.*.id', $users->pluck('id')->all());
有关更多详细信息和示例测试,请参阅 Pull Request #48117,这些测试演示了它的实际应用。
发布说明
您可以在下面看到新功能和更新的完整列表,以及 10.19.0 和 10.20.0 之间的差异,GitHub 上。以下发布说明直接来自 变更日志
v10.20.0
- [10.x] 通过 @axlon 在 https://github.com/laravel/framework/pull/48073 中允许在将值合并到资源时使用默认值
- [10.x] 通过 @tonysm 在 https://github.com/laravel/framework/pull/47973 中为 Eloquent 添加了
createOrFirst
方法 - [10.x] 即使没有
SoftDeletes
模型,也允许在MorphTo
关系上使用withTrashed()
、withoutTrashed()
和onlyTrashed()
,通过 @crynobone 在 https://github.com/laravel/framework/pull/47880 中实现 - [10.x] 通过 @jnoordsij 在 https://github.com/laravel/framework/pull/48085 中将请求 JSON 数据标记为 InputBag,在 docblocks 中实现
- [10.x] Markdown 邮件:允许在自定义组件时省略页脚和页眉,通过 @jorisnoo 在 https://github.com/laravel/framework/pull/48080 中实现
- [10.x] 更新 EmailVerificationRequest 返回 docblock,通过 @ahmedash95 在 https://github.com/laravel/framework/pull/48087 中实现
- [10.x] 从第一方包中添加常用的可重用 Composer 相关命令,通过 @crynobone 在 https://github.com/laravel/framework/pull/48096 中实现
- [10.x] 添加测量单个可调用函数并获取结果的能力,通过 @timacdonald 在 https://github.com/laravel/framework/pull/48077 中实现
- [10.x] 针对
Illuminate\Support\Composer
修复了不正确的可见性方法,并添加了单元测试,通过 @crynobone 在 https://github.com/laravel/framework/pull/48104 中实现 - [10.x] 跳过将空字符串转换为 null 测试,通过 @hungthai1401 在 https://github.com/laravel/framework/pull/48105 中实现
- [10.x] 将迁移转储追加到模式文件时,对 mysqldump 使用完整的插入操作,通过 @emulgeator 在 https://github.com/laravel/framework/pull/48126 中实现
- [10.x] 向 Composer 类添加
hasPackage
方法,通过 @emargareten 在 https://github.com/laravel/framework/pull/48124 中实现 - [10.x] 添加
assertJsonPathCanonicalizing
方法,通过 @gdebrauwer 在 https://github.com/laravel/framework/pull/48117 中实现 - [10.x] 通过环境变量配置存储路径,通过 @sl0wik 在 https://github.com/laravel/framework/pull/48115 中实现
- [10.x] 支持将子查询作为值提供给
where
构建器方法,通过 @gdebrauwer 在 https://github.com/laravel/framework/pull/48116 中实现 - [10.x] 微调,通过 @utsavsomaiya 在 https://github.com/laravel/framework/pull/48138 中实现