Laravel 9.12版本发布

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

Laravel团队发布了9.12版本,其中包含延迟每个通道的通知、跨通道共享日志上下文、在测试时防止杂散的 HTTP 请求等等:


基于闭包的异常测试

Karel Faille 贡献了 assertThrows() 方法,使用闭包测试异常处理的方法:

// 确保抛出异常
$this->assertThrows(fn () => throw Exception(''));
// 确保抛出特定类型的异常
$this->assertThrows(
    fn () => (new SomeActionThatThrowsExceptions)->execute(),
    CustomException::class
);
// 确保抛出带有特定消息的异常
$this->assertThrows(fn () => throw Exception('My message'), Exception::class, 'My message');


强制在测试中伪造HTTP请求

Tim MacDonald 贡献了使用 Laravel 的 HTTP 客户端强制伪造所有 HTTP 请求。

如果测试中没有伪造 HTTP 请求,则测试将抛出异常:

protected function setUp(): void
{
    parent::setUp();
    Http::preventStrayRequests();
}
public function testItDoesTheThingWithoutFaking(): void
{
    $this->post('endpoint-that-utilises-the-http-facade');
   // RuntimeException:在没有匹配伪造的情况下尝试向 [https://acme.com] 请求。
   /* ... */
}


"Throw IF"HTTP客户端方法

@denniseilander为HTTP客户端贡献了一个 throwIf() 方法,如果条件为 true 则抛出异常:

// 抛出 RequestException 异常
return Http::baseUrl('https://foo.bar')
       ->throwIf(true)
       ->get('not-found');
// 不抛出
return Http::baseUrl('https://foo.bar')
       ->throwIf(false)
       ->get('not-found');


允许将 Key/Value数组传递给Artisan选项和参数

Jesper Noordsij将key/value数组传递给Artisan命令上的getArguments和getOptions为了稍微简单的接口。

// 此外,可以跳过你不想使用的那些,而不是 providing/copying 默认值
// 例如:
public function getArguments()
{
    return [
        ['name' => 'argument', 'default' => 'default']
    ];
    // which previously would have been...
    // return [
    //     ['argument', null, '', 'default']
    // ];

请参见 Pull Request #42268 了解更多详情。


更多新的条件方法

Patrick O'Meara 贡献了 whereMorphedTo 和 orWhereMorphedTo 方法。

以下是一个来自 PR 测试的例子:

$model = new EloquentBuilderTestModelParentStub;
$this->mockConnectionForModel($model, '');
$relatedModel = new EloquentBuilderTestModelCloseRelatedStub;
$relatedModel->id = 1;
$builder = $model->whereNotMorphedTo('morph', $relatedModel);
$this->assertSame('select * from "eloquent_builder_test_model_parent_stubs" where not ("morph_type" = ? and "morph_id" = ?)', $builder->toSql());
$this->assertEquals([$relatedModel->getMorphClass(), $relatedModel->getKey()], $builder->getBindings());

查看 Pull Request #42264 了解更多详情。


跨通道和堆栈共享日志上下文

Tim MacDonald 贡献了跨所有日志通道共享上下文信息:

// In a service provider...
public function boot()
{
    Log::shareContext([
        'invocation-id' => (string) Str::uuid(),
    ]);
}


每个通道延迟通知

你可以向延迟方法传递一个数组,以指定特定通道的延迟量:

$user->notify((new InvoicePaid($invoice))->delay([
    'mail' => now()->addMinutes(5),
    'sms' => now()->addMinutes(10),
]));

你也可以在 notification 类中定义一个 withDelay 方法:

/**
 * Determine the notification's delivery delay.
 *
 * @param  mixed  $notifiable
 * @return array
 */
public function withDelay($notifiable)
{
    return [
        'mail' => now()->addMinutes(5),
        'sms' => now()->addMinutes(10),
    ];
}


发行说明

你可以在下面看到新的功能和更新,以及在 GitHub 看 9.11.0 和 9.12.0 之间的差异。以下发行说明直接来自 changelog:

https://github.com/laravel/framework/compare/v9.11.0...v9.12.0
https://github.com/laravel/framework/blob/25127ba88d9a5419ea7a3e99829284e21f7194f2/CHANGELOG.md#v9120---2022-05-10

v9.12.0

新增

新增基于闭包的异常测试 (#42155)
允许通过强制 Http 客户端发出的请求被伪造 (#42230)
新增 'throwIf' 方法到 PendingRequest (#42260)
允许传递 key/value 数组给 getArguments 和 getOptions 方法 (#42268)
新增 whereNotMorphedTo, orWhereNotMorphedTo (#42264)
新增扩展本地数组生成方法 (#42275)
新增基于应通知实例 (#42239)
新增 Illuminate/Pagination/CursorPaginator::onLastPage () (#42301)
新增 findOr 方法到 Query/Builder (#42290)

已修复

修复推送式广播频道过多的问题 (#42287)
修复 Str::Mask () 用于重复字符 (#42295)
修复 EventFake::assertListening () 用于断言基于字符串的观察者侦听器 (#42289)
修复松散比较导致值无法保存的问题 (#41337)
修复 Digits_between 规则的多个点 (#42330)

已更改

启用在使用 beforeSending () 回调时修改 HTTP 客户端请求头 (#42244)
使限制锁获取重试可配置为并发限制器 (#42242)
推迟工厂可调用的扩展 (#42241)
添加 wherehas 软删除作用域 (#42100)
改进密码检查 (#42248)
当使用 forceCreate 在 HasOne 和 HasMany 关系时设置父关系关联的 key (#42281)
确保 phpredis 和 predis 驱动程序之间的前缀覆盖行为相同 (#42279)
跨通道和堆栈共享日志上下文 (#42276)

转:

https://laravel-news.com/laravel-9-12-0

相关文章