Laravel 9.49版本发布
Laravel团队在本周发布了9.49版本, 支持一系列的枚举, CLI提示, 以及更多.
请务必查看更新日志,因为本周的版本充满了新的添加,修复,以及过去两周的变化;
Laravel团队的大部分成员上周都在Laracon EU。
支持铸造集合或枚举数组
Ralph J. Smit贡献了对枚举数组铸造的支持:
use App\Enums\ServerStatus;
use Illuminate\Database\Eloquent\Casts\AsEnumCollection;
protected $casts = [
'statuses' => AsEnumCollection::class.':'.ServerStatus::class,
];
而这里是一个使用数组版本的例子:
use App\Enums\ServerStatus;
use Illuminate\Database\Eloquent\Casts\AsEnumArrayObject;
protected $casts = [
'statuses' => AsEnumArrayObject::class.':'.ServerStatus::class,
];
更多信息请参见Casting Arrays Of Enums文档。
https://laravel.com/docs/9.x/eloquent-mutators#casting-arrays-of-enums
CLI提示
Jess Archer 贡献了自动提示用户缺少命令参数的能力,而不是返回错误。
这个功能可以通过实现PromptsForMissingInput接口来使用:
use Illuminate\Console\Command;
use Illuminate\Contracts\Console\PromptsForMissingInput;
class MyCommand extends Command implements PromptsForMissingInput
{
// ...
}
这一功能也被添加到所有的make:*命令中。
之前:
之后:
新的TestResponse JSON断言
Seth Phat贡献了两个断言方法,用于断言JSON是一个数组和断言JSON是一个对象。
下面是Pull Request #45731中的一些例子:
$this->json('GET', 'countries')
->assertOk()
->assertJsonIsArray(); // [ {..}, {...}, ....]
$this->json('GET', 'users')
->assertOk()
->assertJsonIsArray('data'); // {'data': [...]}
$this->json('GET', 'countries/US')
->assertOk()
->assertJsonIsObject(); // {id: '...', name: '..'}
$this->json('GET', 'users/1')
->assertOk()
->assertJsonIsObject('data'); // {'data': {id: '..', name: '...'}}
"缺失 "的验证规则
Tim MacDonald贡献了 "缺失 "验证规则,它是禁止验证规则的一个严格版本。
被验证的字段必须不存在于输入数据中。
这里列出了所有可能的变体,包括典型的if和unless变体:
`missing`
`missing_if:attribute,value`
`missing_unless:attribute,value`
`missing_with:attribute1,attribute2`
`missing_with_all:attribute1,attribute2`
Wendell Adriel为错误处理贡献了新的HTTP响应方法:
>今天在#Laravel 9.49发布:来自我的PR的HTTP客户端的新方法可以使用
$response->clientError();
$response->serverError();
$response->throwIfStatus(403);
$response->throwUnlessStatus(200)。
你可以查看这里的文档:https://t.co/ETLJRTUKNv
- Wendell Adriel(@wendell_adriel) 2023年1月31日
下面是Wendell贡献的一些方法的例子:
// Only throws an exception if the HTTP response code is 500
$response->throwIfStatus(500);
// Callable
$response->throwIfStatus(fn ($status) => $status === 500);
// Throws an exception if the HTTP response code is not 200
$response->throwUnlessStatus(500);
// Only throws an exception if the HTTP response code is >= 400 and < 500
$response->throwIfClientError();
// Only throws an exception if the HTTP response code is >= 500
$response->throwIfServerError();
请查看HTTP客户端错误处理文档以了解更多细节。
https://laravel.com/docs/9.x/http-client#error-handling
对队列工作者输出的可配置的时区支持
Matias Mäki 贡献了一个 queue.log_timezone 配置选项,
以便 queue:work 能够以不同于应用程序默认 app.timezone 设置的时区输出时间戳:
>增加这个选项的理由是,对于通过Log facade用Log::setTimezone制作的日志文件来说,
这已经是可以做到的,但WorkCommand不是使用Logging子系统,
而是使用Console\OutputStyle直接写回stdout和stderr。
对外键的删除不采取行动
Erfan Hemmati为外键的迁移贡献了一个 noActionOnDelete() 方法:
$table
->foreign('user_id')
->references('id')
->on('users')
->noActionOnDelete();
参考你所选择的数据库的文档以了解它可能如何工作。
为软删除的模型悄悄地添加强制删除
Pascal Huberts 贡献了一个 forceDeleteQuietly() 方法,
在软删除的模型上强制进行硬删除而不引发任何事件:
$model->forceDeleteQuietly();
数组sortDesc()方法
Timur Fralik贡献了一个Arr::sortDesc()方法,该方法将一个数组按其值降序排序:
$sorted = Arr::sortDesc(['Desk', 'Table', 'Chair']);
// ['Table', 'Desk', 'Chair']
发布说明
你可以在GitHub上看到以下完整的新功能和更新列表以及9.48.0和9.49.0之间的差异。
下面的发行说明是直接来自于更新日志:
https://github.com/laravel/framework/compare/v9.48.0...v9.49.0
https://github.com/laravel/framework/blob/5273fac2a86f6aee84d60ae27e1edca9ff5b0d5f/CHANGELOG.md#v9490---2023-01-31
v9.49.0
新增
新增 Illuminate/Database/Schema/ForeignKeyDefinition::noActionOnDelete() (#45712)
为HTTP客户端添加了新的抛出帮助方法(#45704)。
为WorkCommand输出时间戳添加了可配置的时区支持(#45722)。
增加了对包含枚举的数组铸造的支持(#45621)。
增加了 "缺失 "验证规则(#45717)。
添加了/Illuminate/Database/Eloquent/SoftDeletes::forceDeleteQuietly() (#45737)
已添加 Illuminate/Collections/Arr::sortDesc() (#45761)
添加了CLI提示(#45629, #45864)。
为TestResponse添加了assertJsonIsArray和assertJsonIsObject (#45731)
增加Illuminate/Database/Eloquent/Relations/HasOneOrMany::createQuietly() (#45783)
添加验证规则:ascii_alpha、ascii_alpha_num、ascii_alpha_dash (#45769)
提取状态方法到特质(#45789)
为SoftDeletingScope添加 "addRestoreOrCreate "扩展 (#45754)
添加连接建立事件(f850d99)
为模型添加forceDeleting事件(#45836)
在邮件模板中添加标题标签(#45859)
为Collection添加新方法(#45839)
添加跳过取消的中间件(#45869)
修复了
修复PredisClusterConnection.php集群上的flushdb(#45544)
修复刀片标签的嵌套调用问题(#45764)。
修复刀片编译器的无限循环(#45780)。
修复ValidationValidator不接受终止换行的问题(#45790)
修复存根发布命令生成不正确的控制器存根(#45812)。
修复:规范化路由管道异常(#45817)
修复 Illuminate Filesystem replace() 留下可执行文件 (#45856)
已更改
确保通道名称从字符串的开头开始匹配 (#45692)
用对应的Unicode regex符号替换regex表达式中的原始不可见字符(#45680)
优化销毁方法(#45709)
围绕 prohibits_if 统一禁止行为 (#45723)
移除对 bcmath 的依赖(#45729)
也允许砖块/数学0.11(#45762)
优化 BelongsToMany 的 findMany (#45745)
确保小数点规则能处理大数值 (#45693)
支持@js的枚举 (#45862)
当工作者超时工作时,重新启动SIGALRM的系统调用(#45871)
确保对Mailable->to()的连续调用会覆盖之前的条目(#45885)
转:
https://laravel-news.com/laravel-9-49-0
相关文章