Laravel 9.18 发布
Laravel 团队发布了 9.18 jam-packed,其中包含令人惊叹的功能和质量改进。让我们看一下 Laravel 9 中现在可用的突出功能的高级细节!
改进邮件和通知的文件附件
Tim MacDonald 贡献了 attachable objects,你可以使用它来实现标准的附件:
namespace App\Models;
use Illuminate\Contracts\Mail\Attachable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Mail\Attachment;
class Photo extends Model implements Attachable
{
/**
* 获取模型的可附加表示
*
* @return \Illuminate\Mail\Attachment
*/
public function toMailAttachment()
{
return Attachment::fromPath('/path/to/file');
}
}
构建电子邮件时,你可以通过 attach()
方法传递模型实例:
public function build()
{
return $this->view('photos.resized')
->attach($this->photo);
}
有关此功能的完整详细信息,请参阅新的 可附加对象 文档!
可调用的验证类
Tim MacDonald 提供了可调用的验证类:
本 PR 旨在引入一个新的基于类的验证实现,通过引入可调用的验证规则,将基于闭包的规则的简洁性与基于类的规则的可共享、可扩展和可链接的特性相结合。
这是 Pull Request #42689 的示例实现:
class InvokableQuantity implements InvokableRule
{
public function __invoke($attribute, $value, $fail)
{
if (! is_array($value)) {
return $fail('validation.quantity.must_be_an_object')->translate();
}
if (! array_key_exists('magnitude', $value)) {
$fail('validation.quantity.missing_magnitude')->translate();
}
if (! array_key_exists('units', $value)) {
$fail('validation.quantity.missing_units')->translate();
}
}
}
Predis 2.0
Dries Vints 为 Predis 2.0 提供了支持。 Predis 2.0.0 是一个维护版本,所以不会有任何问题。
通过嵌套数组定义嵌套的「with」关系
Tim MacDonald 提供了一种通过嵌套数组定义嵌套急切加载关系的方法:
// 使用点符号
$books = Book::with('author.contacts')->get();
// Nested array
$books = Book::with([
'author' => [
'contacts',
'publisher',
],
])->get();
将宿主方法添加到 Illuminate Request 对象
Pull Request #42797 在 Illuminate Request 实例上提供了三种方便的方法来访问底层 Symphony 方法:
$request->host(); // getHost()
$request->httpHost(); // getHttpHost()
$request->schemeAndHttpHost(); // getSchemeAndHttpHost()
可调用验证规则可以将消息推送到嵌套属性
TIM MACDONALD 贡献了可调用验证规则将错误推送到嵌套和其他属性的能力:
class UserRule implements InvokableRule
{
public function __invoke($attribute, $value, $fail)
{
if (! is_array($attribute) || array_is_list($attribute)) {
return $fail('Must be an object.'); // 适用于 $attribute
}
if (! array_key_exists('name', $attribute)) {
return $fail("{$attribute}.name", 'Is required.'); // 适用于嵌套属性
}
/* ... */
}
}
鉴于上述实现,这是一个使用示例:
Validator::make(
[
'user_1' => ['xxxx'],
'user_2' => ['age' => 23],
],
[
'user_1' => [new UserRule()],
'user_2' => [new UserRule()],
]
);
// 错误信息...
[
'user_1' => ['Must be an object.'],
'user_2.name' => ['Is required.'],
]
引入 fake() 助手函数
Tim MacDonald 贡献了一个全局的 fake()
助手函数,让你可以轻松访问单例 faker 实例。在进行原型设计、测试和生成工厂和种子数据时,使用此助手函数将会很有帮助:
@for($i = 0; $i < 10; $i++)
<dl>
<dt>Name</dt>
<dd>{{ fake()->name() }}</dd>
<dt>Phone</dt>
<dd>{{ fake()->phoneNumber() }}</dd>
</dl>
@endfor
这是特定于语言环境的 faker 使用的示例:
fake()->name() // config('app.faker_locale') ?? 'en_US'
fake('en_AU')->name() // en_AU
累计查询时长限制回调
Tim MacDonald 在累积查询限制持续时间后提供了一个回调处理程序:
DB::handleExceedingCumulativeQueryDuration(Interval::seconds(5), function (Connection $connection) {
Log::warning("Database queries exceeded 5 seconds on {$connection->getName()}");
});
要了解有关此功能的更多信息,请查看 官方文档 了解累积查询时间。此外,请查看 Pull Request #42744,了解有关此功能的实施细节和讨论。
发行说明
你可以在下面查看新功能和更新的完整列表以及在 GitHub 上查看 9.17.0 和 9.18.0 之间的差异。以下发行说明直接来自 changelog:
v9.18.0
新增
- 改进邮件和通知的文件附件 (#42563)
- 引入 Invokable 验证类 (#42689)
- Predis v2.0 (#42577)
- 添加了
Illuminate/View/Compilers/Concerns/CompilesConditionals: :compileReadonly()
(#42717) - 在游标分页中应用来自联合查询生成器的位置(#42651)
- 添加了将
with
关系定义为嵌套数组的功能 (#42690) - 添加了功能在广播事件中设置退避 (#42737)
- 添加
host()
、httpHost()
、schemeAndHttpHost()
到请求 (#42797) - 允许可调用规则将消息推送到嵌套(或其他)属性(#42801)
- 将
compilePushIf
和compileEndpushIf
函数添加到 View 编译器 (#42762) - 添加:允许在测试期间删除令牌 (#42841)
- 在
Illuminate/Console/GeneratorCommand
(#42832)reservedNames
数组中添加了预定义常量 - 围绕单个枚举处理集合创建 (#42839)
- 在
whereNotMorphedT
中允许可以为空的变形 (#42878) - 引入一个
fake()
助手来解决每个区域设置的 faker 单例 (#42844) - 允许处理每个 DB 连接的累积查询持续时间限制 (#42744)
- 添加可调用选项以生成规则命令 (#42742)
修复
- 修复
route:list
命令中的弃用错误 (#42704) - 修复了没有
routeResolver
的请求offsetExists
(#42754) - 修正:松散比较导致值不被保存(#42793)
- 修正:修复数据库会话驱动程序不断重置 CSRF 令牌 (#42782)
- 修正:
Arr::map
- 使用内置函数修复地图引用 (#42815) - 修正
league/flysystem
建议 (#42872)
变更
- 在 TestResponse 中启动会话以允许从 JSON 编组错误包 (#42710)
- 重命名
Illuminate/Broadcasting/BroadcastManager
中的方法(753e9fd) - 避免在
Illuminate/Filesystem/FilesystemAdapter::mimeType()
中使用无效的 mime-type (#42761) - 不解析已经在
Illuminate/Filesystem/FilesystemAdapter
中设置的标头(#42760) - 标准化可调用规则翻译功能 (#42873)
- 使用箭头设置属性时清除演员缓存 (#42852)
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。