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 VintsPredis 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
  • compilePushIfcompileEndpushIf 函数添加到 View 编译器 (#42762
  • 添加:允许在测试期间删除令牌 (#42841
  • Illuminate/Console/GeneratorCommand#42832reservedNames 数组中添加了预定义常量
  • 围绕单个枚举处理集合创建 (#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 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://laravel-news.com/laravel-9-18-0

译文地址:https://learnku.com/laravel/t/69042

本文为协同翻译文章,如您发现瑕疵请点击「改进」按钮提交优化建议
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!