Laravel9.18版本发布

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

Laravel 团队发布了 9.18,其中包含令人惊叹的功能和生活质量改进。 

让我们看一下 Laravel 9 中现在可用的突出功能的高级细节!

>Laravel 9.18.0 今天发布了。 自然地,它有一些我认为你会挖掘的 *fire* 功能。 让我们跳进去。

首先,@timacdonald87 引入了一种新方法,如果您在请求期间查询数据库所花费的累积时间超过阈值,则会调用闭包 pic.twitter.com/TBPA4P6Rx3
— Taylor Otwell (@taylorotwell) 2022 年 6 月 21 日


改进邮件和通知的文件附件

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);
}

有关此有益功能的完整详细信息,请参阅新的可附加对象文档!

https://laravel.com/docs/9.x/mail#attachable-objects


可调用的验证类

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 提供了一种通过嵌套数组定义嵌套的急切加载关系的方法:

// 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

这是特定于语言环境的伪造者使用的示例:

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()}");
});

要了解有关此功能的更多信息,请查看官方文档以了解累积查询时间。

https://laravel.com/docs/9.x/database#monitoring-cumulative-query-time 

此外,请查看 Pull Request #42744 以了解有关此功能的实施细节和讨论。


发行说明

您可以在下面查看新功能和更新的完整列表以及 GitHub 上 9.17.0 和 9.18.0 之间的差异。 

以下发行说明直接来自变更日志:

https://github.com/laravel/framework/compare/v9.17.0...v9.18.0
https://github.com/laravel/framework/blob/bb91c958532eb7c135d61d52c6c52f77c2ae7f9c/CHANGELOG.md#v9180---2022-06-21


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 中为 reservedNames 数组添加了预定义常量 (#42832)
围绕单个枚举处理集合创建 (#42839)
在 whereNotMorphedT (#42878) 中允许可以为空的变形
根据语言环境,引入 fake() 助手来解决 faker 单例 (#42844)
允许处理每个 DB 连接的累积查询持续时间限制 (#42744)
添加可调用选项以制定规则命令 (#42742)

修复

修复 route:list 命令中的弃用错误 (#42704)
修复了没有 routeResolver 的请求 offsetExists (#42754)
修复:松散比较导致值不被保存(#42793)
修复:修复数据库会话驱动程序不断重置 CSRF 令牌 (#42782)
已修复:Arr::map - 使用内置函数修复 map-by-reference (#42815)
固定联赛/飞行系统建议 (#42872)

改变

在 TestResponse 中启动会话以允许从 JSON 编组错误包 (#42710)
重命名 Illuminate/Broadcasting/BroadcastManager (753e9fd) 
中的方法
避免在 Illuminate/Filesystem/FilesystemAdapter::mimeType() 中抛出无效的 mime-type (#42761)
不要解析 Illuminate/Filesystem/FilesystemAdapter 中已设置的标头 (#42760)
标准化可调用规则转换功能 (#42873)
使用箭头设置属性时清除强制转换缓存 (#42852)


转:

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

相关文章