Happy New Year!
编程

Laravel 11 新功能提前预览

608 2023-09-02 14:32:00

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

流式目录结构

目前,仅是 beta 版预览,可能还会调整。不过这是目前可以期待的…

控制器默认不再继承。

不再有中间件目录。当前 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 更新

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

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

新增 Dumpable Trait

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

This aims to streamline the core of the framework since multiple classes currently have "dd" or "dump" methods. Plus you can use this Dumpable trait in your own classes:

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

配置更改

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

与此相匹配的是新的  config:publish 命令,这样你就可以将任何想配置的选项带回来。即使带回后,新的级联特性也允许你将每一个不需要自定义的选项删除。

默认迁移文件瘦身

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

路由变更

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

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

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();

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

最低支持 PHP 8.2

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

安装 Laravel 11

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

laravel new projectname --dev

Laravel 支持政策

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

VersionPHP (*)ReleaseBug Fixes UntilSecurity Fixes Until
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 版中,旨在改进工作流。可能会有所调整,我们将保持更新。