laravel
1. 序言
发行说明

版本方案

Laravel 及其其他第一方包遵循语义化版本控制 (opens in a new tab)。主要框架版本每年(约在第一季度)发布,而次要和补丁版本可能每周都会发布。次要和补丁版本绝不应包含破坏性更改。

当从您的应用程序或包中引用 Laravel 框架或其组件时,您应始终使用版本约束,如 ^11.0,因为 Laravel 的主要版本确实包含破坏性更改。然而,我们努力确保您可以在一天或更短时间内更新到新的主要版本。

命名参数

命名参数 (opens in a new tab)不在 Laravel 的向后兼容性指南范围内。为了改进 Laravel 代码库,我们可能会选择在必要时重命名函数参数。因此,在调用 Laravel 方法时使用命名参数应谨慎进行,并理解参数名称在未来可能会更改。

支持策略

对于所有 Laravel 版本,提供 18 个月的错误修复和 2 年的安全修复。对于所有其他库,包括 Lumen,只有最新的主要版本会收到错误修复。此外,请查看Laravel 支持的数据库版本

版本PHP(*)发布时间错误修复截至安全修复截至
98.0 - 8.22022 年 2 月 8 日2023 年 8 月 8 日2024 年 2 月 6 日
108.1 - 8.32023 年 2 月 14 日2024 年 8 月 6 日2025 年 2 月 4 日
118.2 - 8.32024 年 3 月 12 日2025 年 9 月 3 日2026 年 3 月 12 日
128.2 - 8.32025 年第一季度2026 年第三季度2027 年第一季度
生命周期结束
仅提供安全修复

(*)支持的 PHP 版本

Laravel 11

Laravel 11 通过引入简化的应用程序结构、每秒速率限制、健康路由、优雅的加密密钥轮换、队列测试改进、Resend (opens in a new tab) 邮件传输、Prompt 验证器集成、新的 Artisan 命令等,延续了 Laravel 10.x 中的改进。此外,还引入了 Laravel Reverb,这是一个第一方的、可扩展的 WebSocket 服务器,为您的应用程序提供强大的实时功能。

PHP 8.2

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

简化的应用程序结构

Laravel 的简化应用程序结构由 Taylor Otwell (opens in a new tab)Nuno Maduro (opens in a new tab) 开发

Laravel 11 为的 Laravel 应用程序引入了简化的应用程序结构,而不需要对现有应用程序进行任何更改。新的应用程序结构旨在提供更精简、更现代的体验,同时保留 Laravel 开发人员已经熟悉的许多概念。下面我们将讨论 Laravel 新应用程序结构的亮点。

应用程序引导文件

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 应用程序结构包含五个服务提供者,而 Laravel 11 只包含一个 AppServiceProvider。以前服务提供者的功能已合并到 bootstrap/app.php 中,由框架自动处理,或者可以放置在应用程序的 AppServiceProvider 中。

例如,事件发现现在默认启用,大大减少了手动注册事件及其监听器的需求。但是,如果您确实需要手动注册事件,可以在 AppServiceProvider 中简单地进行。同样,您以前可能在 AuthServiceProvider 中注册的路由模型绑定或授权门也可以在 AppServiceProvider 中注册。

选择加入的 API 和广播路由

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

php artisan install:api
 
php artisan install:broadcasting

中间件

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

在 Laravel 11 中,这些中间件已移入框架本身,因此它们不会增加应用程序结构的体积。框架中添加了新的方法来定制这些中间件的行为,可以从应用程序的 bootstrap/app.php 文件中调用:

->withMiddleware(function (Middleware $middleware) {
    $middleware->validateCsrfTokens(
        except: ['stripe/*']
    );
 
    $middleware->web(append: [
        EnsureUserIsSubscribed::class,
    ])
})

由于所有中间件都可以通过应用程序的 bootstrap/app.php 轻松定制,因此不再需要单独的 HTTP“内核”类。

计划任务

通过使用新的 Schedule 外观,现在可以直接在应用程序的 routes/console.php 文件中定义计划任务,无需单独的控制台“内核”类:

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) {
        //...
    });
})

基础 Controller

新 Laravel 应用程序中包含的基础控制器已得到简化。它不再扩展 Laravel 内部的 Controller 类,并且 AuthorizesRequestsValidatesRequests 特征已被移除,如果需要,可以将它们包含在应用程序的各个控制器中:

<?php

namespace App\Http\Controllers;

abstract class Controller
{
    //
}

应用程序默认设置

默认情况下,新的 Laravel 应用程序使用 SQLite 进行数据库存储,并使用 database 驱动程序来处理 Laravel 的会话、缓存和队列。这使您在创建新的 Laravel 应用程序后可以立即开始构建应用程序,而无需安装其他软件或创建其他数据库迁移。

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

Laravel Reverb

Laravel Reverb 由 Joe Dixon (opens in a new tab) 开发

Laravel Reverb (opens in a new tab) 为您的 Laravel 应用程序带来了快速且可扩展的实时 WebSocket 通信,并与 Laravel 现有的事件广播工具套件(如 Laravel Echo)实现了无缝集成。

php artisan reverb:start

此外,Reverb 通过 Redis 的发布/订阅功能支持水平扩展,允许您将 WebSocket 流量分布在多个后端 Reverb 服务器上,所有服务器都支持一个高需求的应用程序。

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

每秒速率限制

每秒速率限制由 Tim MacDonald (opens in a new tab) 贡献

Laravel 现在为所有速率限制器(包括 HTTP 请求和排队任务的速率限制器)支持“每秒”速率限制。以前,Laravel 的速率限制器仅限于“每分钟”粒度:

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

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

健康路由

健康路由由 Taylor Otwell (opens in a new tab) 贡献

新的 Laravel 11 应用程序包含一个 health 路由指令,该指令指示 Laravel 定义一个简单的健康检查端点,该端点可以由第三方应用程序健康监测服务或像 Kubernetes 这样的编排系统调用。默认情况下,此路由在 /up 提供服务:

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

当向此路由发出 HTTP 请求时,Laravel 还将分发一个 DiagnosingHealth 事件,允许您执行与您的应用程序相关的其他健康检查。

优雅的加密密钥轮换

优雅的加密密钥轮换由 Taylor Otwell (opens in a new tab) 贡献

由于 Laravel 会对所有 Cookie 进行加密,包括应用程序的会话 Cookie,因此基本上对 Laravel 应用程序的每个请求都依赖于加密。但是,正因为如此,轮换应用程序的加密密钥会使所有用户退出您的应用程序。此外,使用以前的加密密钥加密的数据将无法解密。

Laravel 11 允许您通过 APP_PREVIOUS_KEYS 环境变量将应用程序的以前加密密钥定义为逗号分隔的列表。

在加密值时,Laravel 将始终使用 APP_KEY 环境变量中的“当前”加密密钥。在解密值时,Laravel 将首先尝试使用当前密钥。如果使用当前密钥解密失败,Laravel 将尝试所有以前的密钥,直到其中一个密钥能够解密该值。

这种优雅的解密方法允许用户在您的加密密钥轮换时仍能不间断地使用您的应用程序。

有关 Laravel 中的加密的更多信息,请查看 加密文档

自动密码重新哈希

自动密码重新哈希由 Stephen Rees-Carter (opens in a new tab) 贡献

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

通常,随着 CPU / GPU 处理能力的提高,bcrypt 工作因子应随着时间的推移而增加。如果您为应用程序增加了 bcrypt 工作因子,当用户通过您的应用程序进行身份验证时,Laravel 现在将优雅地自动重新哈希用户密码。

提示验证

提示验证器集成由 Andrea Marco Sartori (opens in a new tab) 贡献

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

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

$name = text(
    label: '您的名字是什么?',
    validate: fn (string $value) => match (true) {
        strlen($value) < 3 => '名字必须至少为 3 个字符。',
        strlen($value) > 255 => '名字不得超过 255 个字符。',
        default => null
    }
);

然而,当处理许多输入或复杂的验证场景时,这可能会变得繁琐。因此,在 Laravel 11 中,您可以在验证提示输入时充分利用 Laravel 的验证器的全部功能:

$name = text('您的名字是什么?', validate: [
    'name' => 'required|min:3|max:255',
]);

队列交互测试

队列交互测试由 Taylor Otwell (opens in a new tab) 贡献

以前,尝试测试排队任务是否已发布、删除或手动失败是很麻烦的,并且需要定义自定义的队列伪对象和存根。然而,在 Laravel 11 中,您可以使用 withFakeQueueInteractions 方法轻松测试这些队列交互:

use App\Jobs\ProcessPodcast;
 
$job = (new ProcessPodcast)->withFakeQueueInteractions();
 
$job->handle();
 
$job->assertReleased(delay: 30);

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

新的 Artisan 命令

类创建 Artisan 命令由 Taylor Otwell (opens in a new tab) 贡献

已添加新的 Artisan 命令,以允许快速创建类、枚举、接口和特征:

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

模型类型转换改进

模型类型转换改进由 Nuno Maduro (opens in a new tab) 贡献

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 (opens in a new tab)Nuno Maduro (opens in a new tab) 贡献

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

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

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

有关 once 助手的更多信息,请查看助手文档

使用内存数据库进行测试时性能提升

使用内存数据库进行测试时性能提升由 Anders Jenbo (opens in a new tab) 贡献

在测试期间使用 :memory: SQLite 数据库时,Laravel 11 提供了显著的速度提升。为实现这一目标,Laravel 现在维护对 PHP 的 PDO 对象的引用,并在连接之间重复使用它,通常将总测试运行时间缩短一半。

对 MariaDB 的改进支持

对 MariaDB 的改进支持由 Jonas Staudenmeir (opens in a new tab)Julius Kiekbusch (opens in a new tab) 贡献

Laravel 11 包括对 MariaDB 的改进支持。在以前的 Laravel 版本中,您可以通过 Laravel 的 MySQL 驱动程序使用 MariaDB。然而,Laravel 11 现在包含一个专用的 MariaDB 驱动程序,为该数据库系统提供了更好的默认设置。

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

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

改进的模式操作和数据库检查由 Hafez Divandari (opens in a new tab) 贡献

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

use Illuminate\Support\Facades\Schema;

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