Laravel团队发布了9.18版本, 其中充满了令人惊叹的功能和生活质量的改善.让我们来看看Laravel 9中突出的功能的高级细节!
Laravel 9.18.0今天发布了。自然,它有一些*火*的功能,我想你会喜欢。让我们跳进去。
首先,@timacdonald87介绍了一个新的方法, 如果你在一个请求中查询数据库的累计时间超过了一个阈值, 就会调用一个闭包 ⌛pic.twitter.com/TBPA4P6Rx3
改进邮件和通知的文件附件
Tim MacDonald贡献了可附加对象,你可以用它来实现模型的附件。
namespace App\Models;
use Illuminate\Contracts\Mail\Attachable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Mail\Attachment;
class Photo extends Model implements Attachable
{
/**
* Get the attachable representation of the model.
*
* @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旨在引入一个新的基于类的验证实现,通过引入一个可调用的验证规则,将基于Closure的规则的简洁性和基于类的规则的可共享性、可扩展性和可连锁性结合起来。
下面是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();
}
}
}
通过一个嵌套数组定义嵌套的 "与 "关系
Tim MacDonald贡献了一种通过嵌套数组来定义嵌套的急于加载关系的方法。
// Using dot notation
$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.'); // apply to $attribute
}
if (! array_key_exists('name', $attribute)) {
return $fail("{$attribute}.name", 'Is required.'); // apply to nested attribute
}
/* ... */
}
}
鉴于上述实现,这里有一个使用例子。
Validator::make(
[
'user_1' => ['xxxx'],
'user_2' => ['age' => 23],
],
[
'user_1' => [new UserRule()],
'user_2' => [new UserRule()],
]
);
// errors...
[
'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()}");
});
发布说明
你可以在GitHub上看到以下完整的新功能和更新列表以及9.17.0和9.18.0之间的差异。下面的发行说明直接来自更新日志。
v9.18.0
新增
- 改进邮件和通知的文件附件(#42563)
- 引入可调用的验证类(#42689)
- Predis v2.0(#42577)
- 添加
Illuminate/View/Compilers/Concerns/CompilesConditionals::compileReadonly()(#42717) - 在游标分页中应用union查询生成器的where's (#42651)
- 增加了将 "与 "关系定义为嵌套数组的功能(#42690)
- 增加了在广播事件中设置后退的能力(#42737)。
- 为Request添加了host()、httpHost()、schemeAndHttpHost() (#42797)
- 允许可调用的规则将消息推送到嵌套(或其他)属性(#42801)。
- 在View编译器中添加了compilePushIf和compileEndpushIf函数(#42762)
- 新增: 允许在测试中移除token(#42841)
- 在
Illuminate/Console/GeneratorCommand中为 reservedNames 数组添加了 predefined_constants(#42832) - 处理围绕单个枚举的集合创建(#42839)
- 在whereNotMorphedT中允许可归零的形态(#42878)
- 引入一个fake()助手来解决faker的单体,按地区划分(#42844)
- 允许处理每个DB连接的累计查询时间限制(#42744)。
- 为make rule命令添加可调用选项(#42742)
修正了
- 修复route:list命令中的废弃错误(#42704)。
- 固定请求offsetExists而不使用routeResolver(#42754)。
- 修正了。松散的比较导致数值不能被保存(#42793)
- 固定了。修复数据库会话驱动程序不断重设CSRF令牌(#42782)
- 修正了。Arr::map--修复map-by-reference w/ built-ins(#42815)
- 修复了联赛/飞行系统建议(#42872)