编程

Laravel 11 正式发布

1542 2023-09-02 14:32:00

Laravel 11 于 2004 年 3 月 12 日正式发布!其带来的新特性和更新包括:

距离 Laravel 11 原计划的发布日期 2024 年 1 季度,尚有段时间。不过,在 Laracon 上,Taylor 分享了一些新特性,以及一些大的改进

新增 Laravel Reverb 包

Laravel Reverb 是一个 Laravel 应用的新的第一方 WebSocket 服务器,实现了客户端和服务器之间的实时通信。Reverb 的一些功能包括。

速度极快

Reverb 对速度进行了微调。单个服务器可以支持上千个连接及管道数据,而不会出现 HTTP 轮询的延迟和低效率。

无缝集成

使用 Laravel的广播能力开发。与 Reverb 的第一方 Laravel Forge 集成部署。支持 Pulse 的内置监视器。

Built for Scale

利用 Reverb 内置的 Redis 横向扩展支持,无限增加容量,允许你管理跨越多台服务器的连接和通道。

Pusher

Reverb 为 WebSockets 而使用 Pusher 协议,使其可立即与 Laravel 广播和 Laravel Echo 兼容。

精简目录结构

控制器默认不再继承。

不再有中间件目录。当前 Laravel 包含了 9 个中间件,大多你都不会自定义修改。不过,如果你想自定义,可以移步 App/ServiceProvider。比如:

public function boot(): void{
    EncryptCookies::except(['some_cookie']);
}

不再有 Http/Kernel

过去你在 Kernel 做的大部分事情,将可以移到 Bootstrap/App。

return Application::configure()
    ->withProviders()
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        commands: __DIR__.'/../routes/console.php',
    )
    ->withMiddleware(function(Middleware Smiddleware) {
        $middleware->web(append: LaraconMiddleware::class);
})

模型 casts 更新

模型 casts 现在被定义成方法,而非原来的属性。定义成方法后,我们可以做更多的事,比如在 casts 中直接调用其他方法。下面示例调用 Laravel 11 新增的 AsEnumCollection:

protected function casts(): array{
    return [
        'email_verified_at' => 'datetime',
        'password' => 'hashed',
        'options'=› AsEnumCollection::of(UserOption::class),
    ];
}

新增 Dumpable Trait

这旨在流水化框架的核心,因为多个类目前都有 dddump 方法。此外,你可以在自己的类中使用 Dumpable trait:

class Stringable implements JsonSerializable, ArrayAccess
{
    use Conditionable, Dumpable, Macroable, Tappable;
 
    str('foo')->dd();
    str('foo')->dump();

配置更改

Laravel 有许多配置文件,Laravel 11 将移除了这些文件及所有关联的配置项。.env 文件扩展到包含所有这些需要配置的选项。

更多关于配置修改的详情,请查看此处:https://tubring.cn/articles/laravel11-streamlined-configs

默认迁移文件瘦身

从 2014 及 2019 起,当你启用新的 Laravel 时,默认带有一些迁移文件。现在这些会移除日期并合并到只有两个文件。

路由变更

默认,只会有两个路由文件:web.php 和 console.php。API 路由现在可以根据需要通过 php artisan install:api, 安装 API 路由文件和 Laravel Sanctum。

Websocket 广播也一样,通过 php artisan install:broadcasting 命令安装。

新增 up 健康路由

Laravel 11 将包含一个新的  /up 健康路由,其激活 DiagnosingHealthEvent 事件,以便于更好地整合运行时间监控。

APP_KEY Rotation

在 Laravel 的旧版本中,如果更改 APP_KEY,可能会导致数据库中的数据损坏。Laravel 11 使用 APP_PREVIOUS_KEYS 逗号分隔的 list.env 变量进行了新的优雅旋转,不会破坏旧的加密数据。它将使用新密钥自动重新加密数据。

Console Kernel 移除

Console  内核被移除了,你可以将 console 命令移到 routes/console.php。

命名参数

Laravel 的后向兼容性向导不包含命名参数。必要时,为改善 Laravel 的基础代码库,我们可能重命名函数的参数。因此,调用 Laravel 方法时,应该谨慎使用命名参数,且明白该参数名在将来有可能会有更改。

立即加载(Eager Load)限制

Laravel 11 整合了 "eager load limit" 包后的代码。

User::select('id', 'name')->with([
    'articles' => fn($query) => $query->limit(5)
])->get();

更多立即加载限制的信息,请关注博客后续文章。

新的 Artisan 命令

Laravel 11 添加了一些新命令用以快速创建类,枚举,接口和 trait:

pphp artisan make:class
php artisan make:enum
php artisan make:interface
php artisan make:trait

最低支持 PHP 8.2

这是一个早期决定,不过 Laravel 11 应用会要求最低 PHP 8.2 版。如果你运行的是老版本的 PHP,是时候升级了。

SQLite 3.35.0+ 要求

如果您使用 SQLite 数据库,那么 Laravel 11 将需要 SQLite 3.35.0 或更高版本。

Doctrine DBAL 移除

Laravel 不再依赖于 Doctrine DBAL,注册自定义 Doctrines类 型不再是正确创建和更改以前需要自定义类型的各种列类型所必需的。

安装 Laravel 11

Laravel 11 还未发布,不过你可以使用 --dev 标记运行  laravel view 适用或测试它:

laravel new projectname --dev

升级到 Laravel 11

Laravel Shift 是升级到 Laravel 11 的最简单方式,不过你也可以按照 Laravel 的升级向导进行升级。

Laravel 支持政策

对于所有的 Laravel 发行版,提供 18个月的 Bug 修复支持以及两年的安全修复支持。对于所有其他库,包括 Lumen,只有最新的 Major 发行版接收 Bug 修复。

版本PHP (*)发布漏洞修复安全修复
Laravel 98.0 - 8.2February 8th, 2022August 8th, 2023February 6th, 2024
Laravel 108.1 - 8.2Q1 2023August 6th, 2024February 4th, 2025
Laravel 118.2Q1 2024August 5th, 2025February 3rd, 2026

总结

目前为止,所有这些被考虑到 Laravel 11 的 Beta 版中,旨在改进工作流。可能会有所调整,我们将保持更新。