Laravel 8.34 新增 JSON 类型断言和“禁止”验证规则
发布日期:作者: Paul Redmond
Laravel 团队发布了 8.34 版本,其中包含流畅 JSON API 中的类型断言、一个“禁止”验证规则、一个新的事件模拟断言,以及 8.x 分支的最新更改。
route:list 命令中的排除路径选项
@JUNO_OKYO 为 route:list
命令贡献了一个 --without-path
标志。此标志将接受一个逗号分隔的路由路径列表,用于排除这些路径。一些软件包添加了可能与使用软件包的应用程序开发人员无关的路由。在这种情况下,他们可以使用
php artisan route:list --exclude-path=telescope
字符串 remove() 方法
Luke Downing 为 Illuminate\Support
中的 Str
和 Stringable
类贡献了一个 remove()
方法。remove() 方法将接受要从字符串中删除的字符串字符。
// FbarStr::remove('o', 'Foobar');Str::of('Foobar')->remove('o'); // FbrStr::remove(['o', 'a'], 'Foobar');Str::of('Foobar')->remove(['o', 'a']); // oobar (case-insensitive)Str::remove('f', 'Foobar', false);Str::of('Foobar')->remove('f', false);
流畅 JSON 断言中的断言类型
Sven Luijten 为流畅 JSON 断言 API 贡献了 whereType
和 whereAllType
方法。
$response->assertJson(fn (Assert $json) => $json ->whereType('name', 'string') ->whereAllType(['name' => 'string', 'age' => 'integer'])); // Union types are supported$response->assertJson(fn (Assert $json) => $json ->whereType('name', 'string|null') ->whereType('age', ['integer', 'null']));
禁止验证规则
Philo Hermans 贡献了一个新的 禁止验证规则,如果请求体中存在禁止字段(不可变),则该规则将使验证失败。如果您有一个不应该更改的不可变值,但您的 API 在用户尝试更新该值时没有失败,这将非常有用。
相反,如果您在 API 请求中检测到不可变属性,您可以返回验证错误。
// PUT /api/licenses/123-456// {"name":"hello-world", "key":"random-key"} $validated = $request->validate([ 'name' => 'required|max:255', 'key' => 'prohibited',]); // Response: 422// The key field is prohibited
对 Distinct 验证规则的严格验证
@gilbertorussi 为 distinct
验证规则贡献了一个 strict
参数。distinct 规则使用 PHP 的 in_array 函数,如果您传递 strict 参数,则 in_array
检查将变为严格。以下是来自 拉取请求 的一个示例。
$v = new Validator( $trans, ['foo' => ['0100', '100']], ['foo.*' => 'distinct:strict']); // Without strict the above data would fail validation.$this->assertTrue($v->passes());
断言事件监听器
Luís Dalmolin 贡献了断言事件监听器是否已附加到预期事件的功能。
Event::fake(); Event::assertListening( Registered::class, SendEmailVerificationNotification::class); Event::assertListening( Illuminate\Auth\Events\Login::class, [UserEventSubscriber::class, 'handleUserLogin']);
延迟查询构建方法
Joseph Silber 为查询构建器贡献了 lazy()
和 lazyById()
方法,它们将“在幕后分块结果,并返回单个 LazyCollection 结果”。
$lazyCollection = User::lazy(); User::lazy()->each->greet();User::lazy()->map->calculateOutstandingBalance();
有关 lazy()
的文档将很快发布,但现在,我建议您查看 拉取请求 #36699,以了解有关此方法为何有用及其工作原理的更多详细信息。
发布说明
您可以在下面查看新功能和更新的完整列表,以及 8.33.0 和 8.34.0 之间的差异。以下发布说明直接来自 变更日志
v8.34.0
鼓舞人心
- 添加了更多鼓舞人心的语录 (92b7bde)
添加
- 添加了用于检测连接丢失的 WSREP 通信链路故障 (#36668)
- 为
route:list
命令添加了“exclude-path”选项 (#36619, 76e11ee) - 添加了
Illuminate\Support\Str::remove()
和Illuminate\Support\Stringable::remove()
方法 (#36639, 7b0259f, 20e2470) - 添加了
Illuminate\Database\Eloquent\Relations\MorphPivot::getMorphType()
(#36640, 7e08215) - 添加了断言以验证 JSON 中键的类型 (#36638)
- 添加了禁止验证规则 (#36667)
- 为 distinct 验证规则添加了严格比较 (#36669)
- 添加了
Illuminate\Translation\FileLoader::getJsonPaths()
(#36689) - 添加了
Illuminate\Support\Testing\Fakes\EventFake::assertAttached()
(#36690) - 为
Illuminate\Database\Concerns\BuildsQueries
添加了lazy()
和lazyById()
方法 (#36699)
修复
- 修复了使用 PhpRedis 和集群 Redis 实例时使用 cache:clear 的问题。(#36665)
- 修复了在
Illuminate\Validation\Concerns\FormatsMessages::getDisplayableValue()
中将必需的 :input 替换为 PHP 8.1 中的 null 的问题 (#36622) - 修复了 artisan schema:dump 错误 (#36698)
变更
- 调整流畅断言 (#36620)
- 为 schedule:work artisan 命令输出添加了时间戳引用 (#36621)
- 期望自定义 Markdown 可邮件主题位于 mail 子目录中 (#36673)
- 在无法创建 LockableFile 时抛出异常 (#36674)
重构
- 始终优先使用类型安全字符串比较 (#36657)