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 Mutexschedule: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)中的原始消息中缺少密件抄送

原文链接:laravel-news.com/laravel-9-4…