Laravel 9.5 版本发布
发布日期:作者: Paul Redmond
Laravel 团队发布了 9.5 版本,其中包含部分队列模拟、freezeTime() 测试助手、存储 assertDirectoryEmpty() 断言、assertJsonPath() 中的闭包等等。
Collections Implode 方法中的回调支持
@Lito 为 Collect::implode()
贡献了回调支持,以简化 ->map()->implode()
调用。
{{-- Before --}}<span>{{ $user->cities->map(fn ($city) => $city->name.' ('.$city->state->name.')')->implode(', ') }}</span> {{-- Using a callback --}}<span>{{ $user->cities->implode(fn ($city) => $city->name.' ('.$city->state->name.')', ', ') }}</span>
使用 Storage Fake 断言空目录
Mark Beech 为使用 Storage::fake() 实例断言空目录贡献了功能。
// Before 9.5$this->assertEmpty(Storage::disk('temp')->allFiles('/foo')); // +9.5Storage::disk('temp')->assertDirectoryEmpty('/foo');
如果目录中没有文件,但有其他子目录,则断言将失败,因为它包含其他文件夹/文件。 以下是从 pull request 讨论 中的示例。
Storage::fake('temp');Storage::disk('temp')->put('/foo/bar.txt', 'string');Storage::disk('temp')->assertDirectoryEmpty('/'); // fail
JSON 断言 "assertJsonPath()" 现在接受闭包
Fabien Villepinte 贡献了向 assertJsonPath 传递闭包的功能,而不会造成任何向后兼容的破坏。
$response = TestResponse::fromBaseResponse(new Response([ 'data' => ['foo' => 'bar'],])); $response->assertJsonPath('data.foo', 'bar');$response->assertJsonPath('data.foo', fn ($value) => $value === 'bar');
虽然上面的示例使用字符串版本看起来更直接,但现在如果需要围绕路径断言进行更复杂的逻辑,可以使用闭包。
部分队列模拟
Taylor Otwell 为测试中的队列作业贡献了部分模拟功能。
Queue::fake([JobsToFake::class, /* ... */]);
创建 "through" 模型的新方法
Hafez Divandari 贡献了创建新 "through" 模型的功能,而无需覆盖整个 hasOneThrough
或 hasManyThrough
方法。
// Define a `newThroughInstance` methodprotected function newThroughInstance($resource){ return (new \App\Models\ExampleEntity)->setTable($resource);}
新的 Wrap 字符串助手
Markus Hebenstreit 贡献了一个 wrap()
字符串助手。以下是从 pull request 描述 中的示例用法。
Str:wrap('value')->wrap('"');Str::of('value')->wrap('"');str('value')->wrap('"'); // Outputs: "value" Str:wrap('is', 'This ', ' me!');Str::of('is')->wrap('This ', ' me!');str('is')->wrap('This ', ' me!'); // Outputs: This is me!
用于测试的 Freeze Time 助手
@Italo 贡献了一个 freezeTime()
测试方法,该方法将在测试中冻结当前时间。
public function test_something(){ $this->freezeTime(); // Or set the time at the current second for dates // that have no sub-second precision. $this->freezeSecond();}
freezeTime()
方法是对以下内容的语法糖。
$this->travelTo(Carbon::now());
允许在 Http::beforeSending() 中使用可调用对象
Dries Vints 贡献了在 Http::beforeSending()
方法中接受可调用对象的功能,而不仅仅是可调用类。现在,以下示例将起作用,而不会出现 "Call to member function __invoke() on array" 错误。
Http::baseUrl('https://api.example.org') ->beforeSending([ $this, 'prepareRequest' ]) ->asJson() ->withoutVerifying();
发布说明
您可以在下面查看新功能和更新的完整列表,以及 GitHub 上 9.4.0 和 9.5.0 之间的差异。以下发布说明直接来自 变更日志
v9.5.0
已添加
- 在 implode Collection 方法中添加了回调支持。 (#41405)
- 已添加
Illuminate/Filesystem/FilesystemAdapter::assertDirectoryEmpty()
(#41398) - 为 SesTransport 实现电子邮件 "元数据" (#41422)
- 使 assertPath() 接受闭包 (#41409)
- 为 Collection 上的 operatorForWhere 添加了可调用对象支持 (#41414, #41424)
- 添加了部分队列模拟 (#41425)
- 为 schedule:test 命令添加了 --name 选项 (#41439)
- 定义
Illuminate/Database/Eloquent/Concerns/HasRelationships::newRelatedThroughInstance()
(#41444) - 已添加
Illuminate/Support/Stringable::wrap()
(#41455) - 为测试添加 "freezeTime" 助手 (#41460)
- 允许在
Illuminate/Http/Client/PendingRequest.php::runBeforeSendingCallbacks()
中使用带有 beforeSending 的可调用对象 (#41489)
已修复
- 修复了在名称或域上过滤时 route:list 产生的弃用警告 (#41421)
- 修复了当 URL 返回空状态码时 HTTP::pool 响应 (#41412)
- 修复了
Illuminate/Session/Middleware/AuthenticateSession.php
中的 recaller 名称解析 (#41429) - 修复了 /Illuminate/Session/Middleware/AuthenticateSession.php 中使用的 guard 实例 (#41447)
- 修复了 route:list --except-vendor 隐藏 Route::view() 和 Route::redirect() 的问题 (#41465)
已更改
- 在 \Illuminate\Database\Eloquent\Factories\Factory 中的 connection 属性中添加了空类型 (#41418)
- 更新 GeneratorCommand 中的保留名称 (#41441)
- 重新设计 php artisan schedule:list 命令 (#41445)
- 扩展 Eloquent 高阶代理属性 (#41449)
- 允许将命名参数传递给动态范围 (#41478)
- 如果传递了标签但不支持
Illuminate/Encryption/Encrypter.php
中的标签,则抛出异常 (#41479) - 更新 PackageManifest::$vendorPath 初始化,以处理 Composer 供应商目录不在项目目录中的情况 (#41463)