Laravel 9.4版本发布

2023-06-01 00:00:00 laravel 版本 发布

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

相关文章