Laravel 团队发布了 9.4,它具有覆盖 CSRF cookie、Str::lcfirst() 方法、队列邮件的可选重试机制等功能:
允许扩展 VerifyCsrfToken 的 CSRF cookie
@jaggy 通过在应用程序的扩展 CSRF 中间件上VerifyCsrfToken
定义一个方法来提供覆盖的能力:newCookie
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 的人有很大帮助,允许
XSRF-TOKEN
通过添加租户 ID 甚至用户类型来自定义命名方式。
为查询构建器添加 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为and类贡献了一个lcfirst()
方法,它也支持非 ASCII 字符:Str``Stringable
Str::lcfirst('Laravel');
2Str::lcfirst('Laravel framework');
3Str::lcfirst('Мама');
4Str::lcfirst('Мама мыла раму');
在 schedule:list 命令中添加“Mutex”列
@madman-81为命令贡献了一Has Mutex
列schedule:list
,指示互斥锁是否阻止命令。问题#41311解释了本专栏如何帮助调试任何调度程序问题:
今天我遇到了一个未运行的计划任务的问题。我花了一段时间才弄清楚发生了什么,主要是因为它
schedule:list
没有显示任何异常,并且正在按预期更新“下一个到期”时间戳。但是任务没有执行。长话短说,任务卡住了,因为未清除互斥锁,可能是因为计划外的服务器重新启动。
这是基于上述问题中概述的输出示例:
$ php artisan schedule:list
+----------------------------------------------------------+-------------+--------------------+----------------------------+----------------------------+
| Command | Interval | Description | Next Due | Has Mutex |
+----------------------------------------------------------+-------------+--------------------+----------------------------+----------------------------+
| '/usr/bin/php8.0' 'artisan' mycommands:something | */2 * * * * | Process something | 2022-03-03 10:22:00 +00:00 | Yes |
| '/usr/bin/php8.0' 'artisan' mycommands:otherthing | */2 * * * * | Process otherthing | 2022-03-03 10:22:00 +00:00 | |
+----------------------------------------------------------+-------------+--------------------+----------------------------+----------------------------+
支持修改 char 列类型
Hafez Divandari贡献了修改char
列类型的能力:
1Schema::table('users', function (Blueprint $table) {
2 $table->char('name', 50)->nullable()->change();
3});
[The] 学说/dbal 包实际上支持通过将选项设置为 . 来修改
char
列类型为StringType::class。fixed``true
所以这个 PR,将 Laravel 映射
char
到它的 Doctrine 等效string
类型,并设置fixed
选项true
,最终得到 SQL 片段来声明一个 CHAR 列。
排队邮件的重试机制
MaxGiting提供了为排队的邮件指定retryUntil()
方法或timeoutAt
属性的能力。查看Pull Request #41393了解更多详情。
发行说明
您可以在下面查看新功能和更新的完整列表以及GitHub 上9.3.0 和 9.4.0之间的差异。
v9.4.0
添加
- 支持修改 char 列类型
- 将“Mutex”列添加到 'schedule:list' 命令
- 允许 eloquent whereNot() 和 orWhereNot() 处理列和值
- 允许扩展 VerifyCsrfToken 的 CSRF cookie
- 添加
soleValue()
到查询生成器 - 添加
lcfirst()
到Str
和`Stringable - 为排队的邮件添加了 retryUntil 方法
固定的
- 修复了用于身份验证会话的中间件排序
- 修复 LazyCollection 的 takeUntilTimeout 方法
- 修复了可邮寄的嵌套降价文件的目录
- 防止序列化排队作业的默认值
Illuminate/Http/Client/PendingRequest.php
修复了( a54f481)中的 get() 和 head( )
改变了
- 不要使用全局点击助手
- 允许链接
Illuminate/Console/Concerns/InteractsWithIO::newLine
- 设置目的地,因为 Mail SesTransport ( 8ca43f4)中的原始消息中缺少密件抄送