Laravel 11.4 中的可逆表单提示和新的异常 Facade
上次更新于 作者: Paul Redmond
本周,Laravel 团队发布了 v11.4,其中包括可逆表单提示、新的异常 Facade、`Collection::mapInto()` 方法中的枚举支持等等。
介绍异常 Facade
Nuno Maduro 贡献了 `Exceptions` Facade
`Exceptions` Facade 提供了一种在 Laravel 应用程序中一致测试异常的方法。以下是 `Exceptions` Facade 提供的方法列表:
assertReported
assertReportedCount
assertNotReported
assertNothingReported
throwOnReport
throwFirstReported
以下是从 pull request 描述 中的示例,说明了 `Exceptions::fake()` 方法和 `assertReported()` 方法
use Illuminate\Support\Facades\Exceptions; test('example', function () { Exceptions::fake(); $this->post('/generate-report', [ 'throw' => 'true', ])->assertStatus(503); // Service Unavailable Exceptions::assertReported(ServiceUnavailableException::class); // or Exceptions::assertReported(function (ServiceUnavailableException $exception) { return $exception->getMessage() === 'Service is currently unavailable'; });});
阅读我们的 在 Laravel 测试中断言异常 文章以了解更多详细信息。
Livewire 样式指令
@devajmeireles 贡献了使用布尔值样式指令的能力,无需任何定义的值
{{-- Before --}} <x-fetch wire:poll /> {{-- Generates this HTML --}} <div ... wire:poll="wire:poll" /> {{-- After --}}<x-fetch wire:poll /> <div ... wire:poll />
提示中的可逆表单
Luke Downing 贡献了表单提示,它们是用户需要完成的一组分组提示。表单包括能够返回到以前的提示并进行更改的能力,而无需取消命令并重新开始
use function Laravel\Prompts\form; $responses = form() ->text('What is your name?', required: true) ->password('What is your password?', validate: ['password' => 'min:8']) ->confirm('Do you accept the terms?') ->submit();
以下是如何使用先前响应中的值的示例
$responses = form() ->text('What is your name?', name: 'name') ->add(fn () => select('What is your favourite language?', ['PHP', 'JS']), name: 'language') ->add(fn ($responses) => note("Your name is {$responses['name']} and your language is {$responses['language']}")) ->submit();
查看 `laravel/prompts` 项目中的 Pull Request #118,以了解实现细节。此功能已在 提示文档 中记录。
在 `mapInto` 集合方法上添加对枚举的支持
Luke Downing 贡献了对 `Collection::mapInto()` 方法上枚举的支持,它允许您从值的数组构建枚举
public function store(Request $request){ $request->validate([ 'features' => ['array'], 'features.*' => [new Enum(Feature::class)], ]); $features = $request ->collect('features') ->mapInto(Feature::class); if ($features->contains(Feature::DarkMode)) { // ... }}
一个 `afterQuery()` 钩子
Günther Debrauwer 贡献了一个 `afterQuery()` 钩子,在运行查询后运行代码
$query->afterQuery(function ($models) { // Make changes to the queried models ...});
以下是从 pull request 的 描述 中的用例示例
// Before public function scopeWithIsFavoriteOf($query, ?User $user = null) : void{ if ($user === null) { return $query; } $query->addSelect([ // 'is_favorite' => some query ... ]);} $products = Product::withIsFavoriteOf(auth()->user())->get(); if (auth()->user() === null) { $products->each->setAttribute('is_favorite', false);}
以下是如何使用 `afterQuery()` 钩子的代码
// After public function scopeWithIsFavoriteOf($query, ?User $user = null) : void{ if ($user === null) { $query->afterQuery(fn ($products) => $products->each->setAttribute('is_favorite', false)); return; } $query->addSelect([ // 'is_favorite' => some query ... ]);} Product::withIsFavoriteOf(auth()->user())->get();
发行说明
您可以在下面查看新功能和更新的完整列表,以及 GitHub 上 11.3.0 和 11.4.0 之间的差异。以下发行说明直接来自 变更日志
v11.4.0
- [11.x] Apc 缓存 - 通过 @serpentblade 在 https://github.com/laravel/framework/pull/51010 中删除了长期存在的 apc_* 函数
- [11.x] 通过 @devajmeireles 在 https://github.com/laravel/framework/pull/51007 中允许使用 Livewire Wire 布尔值样式指令
- [11.x] 通过 @nunomaduro 在 https://github.com/laravel/framework/pull/50704 中介绍了 `Exceptions` Facade
- [11.x] 通过 @gdebrauwer 在 https://github.com/laravel/framework/pull/50587 中添加了 `afterQuery` 钩子
- 通过 @maddhatter 在 https://github.com/laravel/framework/pull/51009 中修复了计算列映射到错误表的错误
- [11.x] 通过 @saMahmoudzadeh 在 https://github.com/laravel/framework/pull/51015 中改进字符串标题测试
- [11.x] 通过 @gdebrauwer 在 https://github.com/laravel/framework/pull/51016 中修复了在使用 sql server 时 `afterQuery` 方法测试失败的问题
- [11.x] 修复:通过 @sjspereira 在 https://github.com/laravel/framework/pull/51021 中在检查存储库是否存在之前应用数据库连接
- [10.x] 通过 @axlon 在 https://github.com/laravel/framework/pull/51023 中修复了在使用 `cursorPaginate()` 之前在查询中使用 `orderByRaw()` 时发生的错误
- [11.x] 通过 @timmydhooghe 在 https://github.com/laravel/framework/pull/51030 中添加了 RequiredIfDeclined 验证规则
- [11.x] 通过 @lukeraymonddowning 在 https://github.com/laravel/framework/pull/51027 中添加了对 `mapInto` 集合方法上枚举的支持
- [11.x] 通过 @jessarcher 在 https://github.com/laravel/framework/pull/50995 中修复了在使用数字键时提示回退返回值
- [11.x] 通过 @monurakkaya 在 https://github.com/laravel/framework/pull/51029 中添加了对 `int` 支持的枚举到隐式 `Enum` 路由绑定
- [11.x] 通过 @serpentblade 在 https://github.com/laravel/framework/pull/51032 中配置了禁用缓存存储库上的事件
- 恢复 "[11.x] 由 displayName() 设置的作业名称必须由 S… 通过 @RobertBoes 在 https://github.com/laravel/framework/pull/51034 中遵守
- chore:通过 @laterlaugh 在 https://github.com/laravel/framework/pull/51037 中修复了一些评论中的拼写错误
- 由 displayName() 设置的作业名称必须由 Schedule 遵守 通过 @SCIF 在 https://github.com/laravel/framework/pull/51038 中遵守
- 通过 @szepeviktor 在 https://github.com/laravel/framework/pull/51039 中修复了更多拼写错误
- [11.x] 通过 @saMahmoudzadeh 在 https://github.com/laravel/framework/pull/51043 中修复了一些文档块
- [11.x] 通过 @masoudtajer 在 https://github.com/laravel/framework/pull/51066 中在 Http 方法上添加了 @throws ConnectionException 标签,以支持 IDE
- [11.x] 通过 @lioneaglesolutions 在 https://github.com/laravel/framework/pull/51055 中添加了 Prompts `textarea` 回退,并添加了断言测试
- 通过 @timacdonald 在 https://github.com/laravel/framework/pull/51063 中根据密钥验证 MAC
- [11.x] 通过 @JosephSilber 在 https://github.com/laravel/framework/pull/51060 中向 `LazyCollection` 添加了 `throttle` 方法
- [11.x] 通过 @jimmypuckett 在 https://github.com/laravel/framework/pull/51054 中像小时和天一样传递衰减秒或分钟
- [11.x] 通过 @hansnn 在 https://github.com/laravel/framework/pull/51071 中在 SyncQueue 中考虑 after_commit 配置
- [10.x] 通过 @saadsidqui 在 https://github.com/laravel/framework/pull/49787 中修复了数据库层错误
- [11.x] 通过 @nikspyratos 在 https://github.com/laravel/framework/pull/51080 中修复了上下文助手始终需要 `$key` 值的问题
- [11.x] 通过 @jessarcher 在 https://github.com/laravel/framework/pull/51078 中修复了带有可选 `multiselect` 提示的 `expectsChoice` 断言