发布说明

版本方案

Laravel 及其它第一方包遵循语义化版本控制( Semantic Versioning )。框架的主要版本每年发布一次(大约在第一季度),而次要和补丁版本则可能每周发布一次。次要和补丁版本不应包含破坏性变化。

在引用 Laravel 框架或其组件时,应该始终使用版本约束,如 ^11.0,因为 Laravel 的主要版本会包含破坏性更改。然而,我们始终努力确保你在一天之内能够更新到新的主要版本。

命名参数

命名参数 不在 Laravel 的向后兼容性指南覆盖范围内。为了改进 Laravel 代码库,我们可能会在必要时重命名函数参数。因此,在调用 Laravel 方法时使用命名参数应谨慎,并理解这些参数名称未来可能会发生变化。

支持政策

对于所有 Laravel 发布版本,bug 修复提供 18 个月,安全修复提供 2 年。对于所有其它库,包括 Lumen,仅最新的主要版本会接收 bug 修复。此外,请检查 Laravel 支持的数据库版本。

版本 支持 PHP (*) 发布日期 bug 修复截止日期 安全修复截止日期

9

8.0 - 8.2

February 8th, 2022

August 8th, 2023

February 6th, 2024

10

8.1 - 8.3

February 14th, 2023

August 6th, 2024

February 4th, 2025

11

8.2 - 8.4

March 12th, 2024

September 3rd, 2025

March 12th, 2026

12

8.2 - 8.4

Q1 2025

Q3 2026

Q1 2027

Laravel 11

Laravel 11 继续在 Laravel 10.x 上进行改进,引入了更简化的应用程序结构、每秒速率限制、健康路由、优雅的加密密钥轮换、队列测试改进、 Resend 邮件传输、Prompt 验证器集成、新的 Artisan 命令等功能。此外,Laravel Reverb——一个第一方可扩展的 WebSocket 服务器——也已推出,为你的应用程序提供强大的实时能力。

PHP 8.2

Laravel 11.x 要求 PHP 最低版本为 8.2。

精简的应用程序结构

Laravel 精简的应用程序结构是由 Taylor Otwell 和 Nuno Maduro 开发的。

Laravel 11 引入了一个简化的应用程序结构,仅适用于新的 Laravel 应用程序,无需更改现有应用程序。新的应用程序结构旨在提供一个更简洁、更现代的体验,同时保留许多 Laravel 开发者已经熟悉的概念。以下是 Laravel 新应用程序结构的一些亮点。

应用程序引导(Bootstrap)文件

bootstrap/app.php 文件已被改造为代码优先的应用程序配置文件。在此文件中,你现在可以自定义应用程序的路由、中间件、服务提供者、异常处理等。此文件统一了以前分散在应用程序文件结构中的多种高级应用程序行为设置:

return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        commands: __DIR__.'/../routes/console.php',
        health: '/up',
    )
    ->withMiddleware(function (Middleware $middleware) {
        //
    })
    ->withExceptions(function (Exceptions $exceptions) {
        //
    })->create();

服务提供者

Laravel 11 的默认应用程序结构只包含一个 AppServiceProvider,而不是之前包含的 五个服务提供者。以前其它服务提供者的功能已经集成到 bootstrap/app.php 文件中,或者由框架自动处理,或者可以放置在应用程序的 AppServiceProvider 中。

例如,事件发现 现在已默认启用,基本上消除了手动注册事件及其监听器的需求。然而,如果你确实需要手动注册事件,可以直接在 AppServiceProvider 中进行。同样,你可能以前在 AuthServiceProvider 中注册的路由模型绑定或授权门也可以在 AppServiceProvider 中注册。

API 和广播路由选择性启用

默认情况下,api.phpchannels.php 路由文件不再存在,因为许多应用程序不需要这些文件。你可以使用简单的 Artisan 命令来创建它们:

php artisan install:api
php artisan install:broadcasting

中间件

以前,新的 Laravel 应用程序包含 9 个中间件,执行各种任务,如验证请求、修剪输入字符串和验证 CSRF 令牌。

在 Laravel 11 中,这些中间件已被移入框架本身,这样就不会给你的应用程序结构增加负担。新的方法可以通过应用程序的 bootstrap/app.php 文件定制这些中间件的行为:

->withMiddleware(function (Middleware $middleware) {
    $middleware->validateCsrfTokens(
        except: ['stripe/*']
    );

    $middleware->web(append: [
        EnsureUserIsSubscribed::class,
    ])
})

由于所有中间件都可以通过 bootstrap/app.php 文件轻松定制,因此不再需要一个单独的 HTTP "kernel" 类。

调度

通过新的 Schedule 门面,定时任务现在可以直接在应用程序的 routes/console.php 文件中定义,而不再需要单独的控制台 kernel 类:

use Illuminate\Support\Facades\Schedule;

Schedule::command('emails:send')->daily();

异常处理

与路由和中间件一样,异常处理现在可以从应用程序的 bootstrap/app.php 文件中定制,而不再需要单独的异常处理类,从而减少新 Laravel 应用程序中的文件数量:

->withExceptions(function (Exceptions $exceptions) {
    $exceptions->dontReport(MissedFlightException::class);

    $exceptions->report(function (InvalidOrderException $e) {
        // ...
    });
})

基础控制器类

新的 Laravel 应用程序中包含的基础控制器类已简化。它不再继承 Laravel 的内部 Controller 类,且不再包含 AuthorizesRequestsValidatesRequests trait,这些 trait 可以在应用程序的单个控制器中包含(如果需要的话):

<?php
namespace App\Http\Controllers;

abstract class Controller
{
    //
}

应用程序默认值

默认情况下,新 Laravel 应用程序使用 SQLite 作为数据库存储,同时为 Laravel 的会话、缓存和队列使用数据库驱动。这使得你可以在创建新 Laravel 应用程序后立即开始构建应用程序,而无需安装额外的软件或创建额外的数据库迁移。

此外,随着时间的推移,这些 Laravel 服务的数据库驱动已经足够强大,适用于许多应用程序上下文,因此它们为本地和生产应用程序提供了一个合理、统一的选择。

Laravel Reverb

Laravel Reverb 提供极速且可扩展的 WebSocket 实时通信,直接集成到 Laravel 应用程序中,并与 Laravel 的事件广播工具(如 Laravel Echo)无缝对接。Laravel Reverb 支持通过 Redis 的发布/订阅功能进行水平扩展,允许将 WebSocket 流量分发到多个后台 Reverb 服务器,从而支持单个高需求的应用程序。

php artisan reverb:start

有关 Laravel Reverb 的更多信息,请查看完整的 Reverb 文档

每秒速率限制

每秒速率限制是由 Tim MacDonald 贡献的。

Laravel 现在支持所有速率限制器的 “每秒” 速率限制,包括 HTTP 请求和队列作业的速率限制。此前,Laravel 的速率限制器仅限于 “每分钟” 的粒度:

RateLimiter::for('invoices', function (Request $request) {
    return Limit::perSecond(1);
});

有关 Laravel 中速率限制的更多信息,请查看 速率限制文档

健康路由

健康路由由 Taylor Otwell 贡献。

新 Laravel 11 应用程序包括一个健康路由指令,指示 Laravel 定义一个简单的健康检查端点,第三方应用健康监控服务或如 Kubernetes 的 orchestration 系统可以调用此端点。默认情况下,该路由为 /up

->withRouting(
    web: __DIR__.'/../routes/web.php',
    commands: __DIR__.'/../routes/console.php',
    health: '/up',
)

当对该路由发起 HTTP 请求时,Laravel 还会触发 DiagnosingHealth 事件,允许你执行与你的应用程序相关的附加健康检查。

优雅的加密密钥轮换

优雅的加密密钥轮换是由 Taylor Otwell 贡献的。

由于 Laravel 会加密所有 cookie,包括应用程序的会话 cookie,因此每次请求 Laravel 应用程序时,基本上都依赖于加密。然而,这也意味着,旋转应用程序的加密密钥会导致所有用户被强制退出,因为 Laravel 会重新加密所有的会话数据。此外,如果尝试使用旧的加密密钥解密数据,则会变得不可能。

Laravel 11 允许通过 APP_PREVIOUS_KEYS 环境变量定义应用程序的历史加密密钥,格式为以逗号分隔的密钥列表。

在加密数据时,Laravel 总是使用 APP_KEY 环境变量中的 “当前” 加密密钥。当解密数据时,Laravel 首先会尝试使用当前的加密密钥。如果使用当前密钥解密失败,Laravel 将尝试所有历史密钥,直到某个密钥成功解密数据。

这种优雅的解密方式允许用户在加密密钥旋转时仍能不间断地使用应用程序。

欲了解更多关于 Laravel 中加密的内容,请参阅 加密文档

自动密码重新哈希

自动密码重新哈希是由 Stephen Rees-Carter 贡献的。

Laravel 默认的密码哈希算法是 bcrypt。bcrypt 哈希的 "工作因子"(work factor)可以通过 config/hashing.php 配置文件或 BCRYPT_ROUNDS 环境变量进行调整。

通常,随着 CPU / GPU 处理能力的提升,bcrypt 的工作因子应逐步增加。如果你为应用程序增加了 bcrypt 的工作因子,Laravel 现在会在用户身份验证时优雅地自动重新哈希用户的密码。

提示验证

提示验证器集成由 Andrea Marco Sartori 提供。

Laravel Prompts 是一个 PHP 包,用于向命令行应用程序添加美观且用户友好的表单,具有类似浏览器的功能,包括占位符文本和验证。

Laravel Prompts 支持通过闭包进行输入验证:

$name = text(
    label: 'What is your name?',
    validate: fn (string $value) => match (true) {
        strlen($value) < 3 => 'The name must be at least 3 characters.',
        strlen($value) > 255 => 'The name must not exceed 255 characters.',
        default => null
    }
);

然而,当处理多个输入或复杂的验证场景时,这种方式可能会变得繁琐。因此,在 Laravel 11 中,你可以使用 Laravel 验证器 的全部功能来验证提示输入:

$name = text('What is your name?', validate: [
    'name' => 'required|min:3|max:255',
]);

队列交互测试

队列交互测试由 Taylor Otwell 提供。

之前,尝试测试一个队列任务是否已被释放、删除或手动失败是很麻烦的,通常需要定义自定义的队列假对象(fakes)和存根(stubs)。然而,在 Laravel 11 中,你可以使用 withFakeQueueInteractions 方法轻松测试这些队列交互:

use App\Jobs\ProcessPodcast;

$job = (new ProcessPodcast)->withFakeQueueInteractions();

$job->handle();

$job->assertReleased(delay: 30);

有关测试队列任务的更多信息,请查阅 队列文档

新的 Artisan 命令

类创建 Artisan 命令由 Taylor Otwell 提供。

新增了几个 Artisan 命令,用于快速创建类、枚举、接口和 traits:

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

模型类型改进

模型类型改进由 Nuno Maduro 提供。

Laravel 11 支持通过方法而不是属性来定义模型的类型转换。这使得类型转换的定义更加简洁和流畅,特别是在使用带有参数的转换时:

/**
 * 获取应该进行类型转换的属性。
 *
 * @return array<string, string>
 */
protected function casts(): array
{
    return [
        'options' => AsCollection::using(OptionCollection::class),
                  // AsEncryptedCollection::using(OptionCollection::class),
                  // AsEnumArrayObject::using(OptionEnum::class),
                  // AsEnumCollection::using(OptionEnum::class),
    ];
}

有关属性类型转换的更多信息,请查看 Eloquent 文档

once 函数

`once` 辅助函数由 Taylor Otwell 和 Nuno Maduro 提供。

once 辅助函数执行给定的回调,并在请求期间将结果缓存到内存中。任何后续使用相同回调调用 once 函数时,将返回之前缓存的结果:

function random(): int
{
    return once(function () {
        return random_int(1, 1000);
    });
}

random(); // 123
random(); // 123 (缓存结果)
random(); // 123 (缓存结果)

有关 once 辅助函数的更多信息,请查看 帮助文档

改进的内存数据库测试性能

改进的内存数据库测试性能由 Anders Jenbo 提供。

Laravel 11 在使用 :memory: SQLite 数据库进行测试时提供了显著的性能提升。为此,Laravel 现在维护一个对 PHP PDO 对象的引用,并在连接之间重用它,这通常可以将总测试运行时间减少一半。

改进对 MariaDB 的支持

改进对 MariaDB 的支持由 Jonas Staudenmeir 和 Julius Kiekbusch 提供。

Laravel 11 增强了对 MariaDB 的支持。在以前的 Laravel 版本中,你可以通过 Laravel 的 MySQL 驱动使用 MariaDB。然而,Laravel 11 现在包括了一个专用的 MariaDB 驱动,它为该数据库系统提供了更好的默认配置。

有关 Laravel 数据库驱动程序的更多信息,请查看 数据库文档

数据库检查和改进的模式操作

改进的模式操作和数据库检查由 Hafez Divandari 提供。

Laravel 11 提供了额外的数据库 schema 操作和检查方法,包括原生的列修改、重命名和删除操作。此外,还提供了用于操作表、视图、列、索引和外键的高级空间(spatial)类型、非默认模式名称和原生模式方法:

use Illuminate\Support\Facades\Schema;

$tables = Schema::getTables();
$views = Schema::getViews();
$columns = Schema::getColumns('users');
$indexes = Schema::getIndexes('users');
$foreignKeys = Schema::getForeignKeys('users');