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 Prat 为 Str
和 Stringable
类贡献了 lcfirst()
方法,它也支持非 ASCII 字符:
Str::lcfirst('Laravel'); // laravel
Str::lcfirst('Laravel framework'); // laravel framework
Str::lcfirst('Мама'); // мама
Str::lcfirst('Мама мыла раму'); // мама мыла раму
在 schedule:list
命令中添加「Mutex」列
@madman-81 为 schedule: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()
到Str
和Stringable
(#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 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
基辅还没沦陷