Laravel 9.4版本发布
Laravel 团队发布了 9.4,它具有覆盖 CSRF cookie、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() 方法来查询构建器以从唯一值而不是整个记录返回列:
// bails if there is not exactly one result,
// but returns an object
$query->sole(['id']);
// returns just the value, but no safety around
// there being exactly one result
$query->value('id');
// To get the ID, we must do
$query->sole(['id'])->id;
此更新允许以下用法:
// bails if there is not exactly one result,
// but returns an object
$query->sole(['id']);
// returns just the value, but no safety around
// there being exactly one result
$query->value('id');
// Bails if there is not exactly one result
// and returns just the value
$query->soleValue('id');
添加字符串 lcfirst() 方法
Vincent Prat 为 Str 和 Stringable 类贡献了一个 lcfirst() 方法,它也支持非 ASCII 字符:
> 今天我遇到了一个未运行的计划任务的问题。
我花了一段时间才弄清楚事情的进展,主要是因为 schedule:list 没有显示任何异常,并且正在按预期更新“Next Due”时间戳。
但是任务没有执行。
长话短说,任务卡住了,因为互斥锁没有被清除,可能是因为计划外的服务器重启。
这是基于上述问题中概述的输出示例:
$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 列类型的能力:
Schema::table('users',function(Blueprint $table) {
$table->char('name',50)->nullable()->change();
});
> [The] 学说/dbal包实际上支持通过将固定选项设置为true来将char列类型修改为StringType::class。
所以这个PR,将Laravel char映射到它的Doctrine等效字符串类型,并将fixed选项设置为true,
最终得到SQL片段来声明一个CHAR列。
排队邮件的重试机制
MaxGiting 提供了为排队的邮件指定 retryUntil() 方法或 timeoutAt 属性的能力。
查看 Pull Request #41393 了解更多详情。
发行说明
您可以在下面查看新功能和更新的完整列表以及 GitHub 上 9.3.0 和 9.4.0 之间的差异。
以下发行说明直接来自变更日志:
https://github.com/laravel/framework/compare/v9.3.0...v9.4.0
https://github.com/laravel/framework/blob/246f05cefacdd33e5b28f38f1700fc593a6db9c7/CHANGELOG.md#v920-2022-02-22
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)
修复了可邮寄的嵌套 markdown 文件的目录 (#41366)
防止序列化排队作业的默认值 (#41348)
修复了 Illuminate/Http/Client/PendingRequest.php (a54f481) 中的 get() 和 head()
修改
不要使用全局 Tap 助手 (#41326)
允许链接 Illuminate/Console/Concerns/InteractsWithIO::newLine (#41327)
设置目的地,因为 Mail SesTransport (8ca43f4) 中的原始消息中缺少密件抄送
转:
https://laravel-news.com/laravel-9-4-0
相关文章