Laravel 9.49版本发布

2023-06-01 00:00:00 laravel 版本 发布

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:*命令中。

之前:

1.png

之后:

2.png


新的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

相关文章