Laravel 9.4 发布
发布日期:作者: Paul Redmond
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 错误。多个身份验证提供者也会导致这种情况发生,特别是在 XHR 请求中。这还允许多租户系统从中间件层更新令牌的域(例如,从中间件层获取当前租户的自定义域)。
我认为这将非常有助于使用 Inertia 的用户,让他们能够自定义
XSRF-TOKEN
的命名方式,例如添加租户 ID 甚至用户类型。
向查询生成器添加 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');
添加 String lcfirst() 方法
Vincent Prat 为 Str
和 Stringable
类贡献了 lcfirst()
方法,该方法也支持非 ASCII 字符。
Str::lcfirst('Laravel'); // laravelStr::lcfirst('Laravel framework'); // laravel frameworkStr::lcfirst('Мама'); // мамаStr::lcfirst('Мама мыла раму'); // мама мыла раму
在 schedule:list 命令中添加“Mutex”列
@madman-81 为 schedule:list
命令贡献了 Has Mutex
列,用于指示是否有互斥锁阻止了命令执行。问题 #41311 解释了此列如何帮助调试任何调度器问题。
今天我遇到了一个调度任务没有运行的问题。我花了一些时间才弄清楚发生了什么,主要是因为
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();});
doctrine/dbal 包实际上支持修改
char
列类型,方法是通过将fixed
选项设置为true
来使用 StringType::class 。因此,此 PR 将 Laravel 的
char
映射到其 Doctrine 等效的string
类型,并将fixed
选项设置为true
,这最终会 获得用于声明 CHAR 列的 SQL 代码片段 。
队列邮件的重试机制
MaxGiting 贡献了为队列邮件指定 retryUntil()
方法或 timeoutAt
属性的能力。有关更多详细信息,请查看 Pull Request #41393 。
发行说明
您可以在下面查看完整的新功能和更新列表,以及 9.3.0 和 9.4.0 之间的差异。以下发行说明直接来自 变更日志
v9.4.0
新增
- 支持修改 char 列类型 (#41320)
- 在‘schedule:list’命令中添加“Mutex”列 (#41338)
- 允许 eloquent whereNot() 和 orWhereNot() 在列和值上工作 (#41296)
- 允许扩展 VerifyCsrfToken 的 CSRF cookie (#41342)
- 向查询生成器添加
soleValue()
(#41368) - 向
Str
和Stringable
添加lcfirst()
(#41384) - 向队列邮件添加 retryUntil 方法 (#41393)
修复
- 修复了用于验证会话的身份验证中间件排序 (50b46db)
- 修复了 LazyCollection 的 takeUntilTimeout 方法 (#41354,#41370)
- 修复了邮件中嵌套 markdown 文件的目录 (#41366)
- 防止序列化队列作业的默认值 (#41348)
- 修复了
Illuminate/Http/Client/PendingRequest.php
中的 get() 和 head() (a54f481)