Laravel 9.4 发布

Laravel 团队发布的 9.4 版本中提供了覆写 CSRF cookies 的能力, Str::lcfirst()方法, 队列邮件的可选重试机制等:

允许扩展 VerifyCsrfToken 的 CSRF cookie

@jaggy 通过在应用拓展的 CSRF 中间件中定义了newCookie方法,提供了覆写 VerifyCsrfToken 的能力。

class VerifyCsrfToken extends Middleware {
    protected function newCookie($request, $config)
    {
        return new Cookie(
            "XSRF-TOKEN-{$request->user()->type}",
            $request->session()->token(),
            $this->availableAt(60 * $config['lifetime']),
            $config['path'],
            $config['domain'],
            $config['secure'],
            false,
            false,
            $config['same_site'] ?? null,
        );
    }
}

虽然大多数应用都不需要覆写默认的行为, 但是 PR 作者提供了以下的使用场景:

在多租户系统中的某些情况下,用户可能希望更改 CSRF 令牌名称以防止 419 错误。多个 Auth 提供者也主要在 XHR 请求中实现这一点。这也允许多租户系统从中间件层更新令牌的域(即拉取当前租户的自定义域)。

我认为这对使用 Inertia 的人们有很大帮助,允许通过添加租户 ID 甚至用户类型来自定义XSRF-TOKEN的命名方式。

为查询构建器添加 soleValue() 方法

Matthew Hailwood 贡献了一个新的 soleValue() 方法,查询构建器在唯一值字段进行匹配并返回整条记录:

// 如果不只有一条记录,则停止
// 但会返回的一个对象
$query->sole(['id']);

// 只返回值,但没有安全性
// 恰好有一个结果
$query->value('id');

// 要获得唯一 ID,我们必须这样做
$query->sole(['id'])->id;

此更新允许以下用法:

// 如果不只有一条记录,则停止
// 但会返回的一个对象
$query->sole(['id']);

// 只返回值,但没有安全性
// 恰好有一个结果
$query->value('id');

// 如果不只有一条记录,则停止
// 并只返回值
$query->soleValue('id');

添加 lcfirst() 字符串方法

Vincent PratStrStringable 类贡献了 lcfirst() 方法,它也支持非 ASCII 字符:

Str::lcfirst('Laravel'); // laravel
Str::lcfirst('Laravel framework'); // laravel framework
Str::lcfirst('Мама'); // мама
Str::lcfirst('Мама мыла раму'); // мама мыла раму

schedule:list 命令中添加「Mutex」列

@madman-81schedule:list 命令提供了一个Has Mutex 列,指示互斥锁是否阻止命令。问题 #41311 解释了本专栏如何帮助调试任何调度程序问题:

今天我遇到了一个未运行的计划任务的问题。我花了一段时间才弄清楚发生了什么,主要是因为 schedule:list 没有显示任何异常,并且正在按预期更新「下一个到期」时间戳。但是任务没有执行。长话短说,任务卡住了,因为互斥锁没有被清除,可能是因为计划外的服务器重启。

这是基于上述问题中概述的输出示例:

$ php artisan schedule:list
+---------------------------------------+-------------+-------------+---------------------+-----------+
| Command                               | Interval    | Description | Next Due            | Has Mutex |
+---------------------------------------+-------------+-------------+---------------------+-----------+
| 'php' 'artisan' mycommands:something  | */2 * * * * | something   | 2022-03-03 10:22:00 | Yes       |
| 'php' 'artisan' mycommands:otherthing | */2 * * * * | otherthing  | 2022-03-03 10:22:00 |           |
+---------------------------------------+-------------+-------------+---------------------+-----------+

支持修改 Char 列类型

Hafez Divandari 贡献了修改char列类型的能力:

Schema::table('users', function (Blueprint $table) {
    $table->char('name', 50)->nullable()->change();
});

doctrine/dbal 包实际上支持通过设置将 char 列类型修改为 StringType::class 将选项固定为 true

因此,这个 PR 将 Laravel char 映射到其 Doctrine 等效的 string 类型,并将 fixed 选项设置为 true 获取 SQL 片段以声明 CHAR 列

队列邮件重试机制

MaxGiting 为队列中的可发送邮件提供了指定 retryUntil() 方法或 timeoutAt 属性的能力。查看 Pull Request #41393 了解更多详情。

发行说明

您可以在下方查看新功能和更新的完整列表以及 9.3.0 和 9.4.0 之间的差异 在 GitHub。以下发行说明直接来自 变更日志

v9.4.0

新增

  • 支持修改 char 列类型 (#41320)
  • 将 「Mutex」列添加到 schedule:list 命令 (#41338)
  • 允许 eloquent 的 whereNot()orWhereNot() 处理列和值 (#41296)
  • 允许扩展 VerifyCsrfToken 的 CSRF cookie (#41342)
  • 向查询构建器添加了 soleValue() (#41368)
  • 添加了 lcfirst()StrStringable (#41384)
  • retryUntil 方法添加到队列邮件中 (#41393)

修复

  • 修复了用于验证会话的中间件排序 (50b46db)
  • 修正 LazyCollection 的 takeUntilTimeout 方法 (#41354, #41370 )
  • 修复了 mailables 的嵌套 markdown 文件的目录 (#41366)
  • 规避序列化排队作业的默认值错误问题 (#41348)
  • 修复了 Illuminate/Http/Client/PendingRequest.php 中的 get() 和 head() 方法(a54f481)

变更

  • 不使用全局点击助手 (#41326)
  • 允许链接Illuminate/Console/Concerns/InteractsWithIO::newLine#41327
  • 设置 Destinations,因为 Mail SesTransport 中的原始消息中缺少密件抄送 (8ca43f4)
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

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

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

本文为协同翻译文章,如您发现瑕疵请点击「改进」按钮提交优化建议
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 1

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