发布说明

版本方案
支持政策
Laravel 11

版本方案

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

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

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

支持政策

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

版本 PHP (*) 发布 错误修复截止 安全修复截止
9 8.0 - 8.2 2022年2月8日 2023年8月8日 2024年2月6日
10 8.1 - 8.3 2023年2月14日 2024年8月6日 2025年2月4日
11 8.2 - 8.3 2024年3月12日 2025年9月3日 2026年3月12日
12 8.2 - 8.3 2025年第一季度 2026年第三季度 2027年第一季度

仅安全修复

(*) 支持的 PHP 版本

Laravel 11

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

PHP 8.2

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

简化的应用程序结构

Laravel 的简化应用程序结构由 Taylor OtwellNuno Maduro 开发。

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

应用程序引导文件
php bootstrap/app.php 文件已被重新设计为一个代码优先的应用程序配置文件。从这个文件中,您现在可以自定义应用程序的路由、中间件、服务提供者、异常处理等。这个文件统一了之前分散在应用程序文件结构中的各种高级应用程序行为设置:

  1. return Application::configure(basePath: dirname(__DIR__))
  2. ->withRouting(
  3. web: __DIR__.'/../routes/web.php',
  4. commands: __DIR__.'/../routes/console.php',
  5. health: '/up',
  6. )
  7. ->withMiddleware(function (Middleware $middleware) {
  8. //
  9. })
  10. ->withExceptions(function (Exceptions $exceptions) {
  11. //
  12. })
  13. ->create();

服务提供者
默认的 Laravel 应用程序结构包含五个服务提供者,而 Laravel 11 仅包含一个 php AppServiceProvider。之前服务提供者的功能已被整合到 php bootstrap/app.php 中,自动由框架处理,或可以放置在应用程序的 php AppServiceProvider 中。

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

选择性 API 和广播路由
默认情况下,不再包含 php api.phpphp channels.php 路由文件,因为许多应用程序不需要这些文件。相反,它们可以通过简单的 Artisan 命令创建:

  1. php artisan install:api
  2. php artisan install:broadcasting

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

在 Laravel 11 中,这些中间件已被移入框架本身,因此它们不会增加应用程序结构的负担。用于自定义这些中间件行为的新方法已添加到框架中,并可以从应用程序的 php bootstrap/app.php 文件中调用:

  1. ->withMiddleware(function (Middleware $middleware) {
  2. $middleware->validateCsrfTokens(
  3. except: ['stripe/*']
  4. );
  5. $middleware->web(append: [
  6. EnsureUserIsSubscribed::class,
  7. ]);
  8. })

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

任务调度
通过新的 php Schedule facade,现在可以直接在应用程序的 php routes/console.php 文件中定义计划任务,从而无需单独的控制台 “kernel” 类:

  1. use Illuminate\Support\Facades\Schedule;
  2. Schedule::command('emails:send')->daily();

异常处理
与路由和中间件类似,现在可以从应用程序的 php bootstrap/app.php 文件中自定义异常处理,而不是使用单独的异常处理类,从而减少新 Laravel 应用程序中的文件数量:

  1. ->withExceptions(function (Exceptions $exceptions) {
  2. $exceptions->dontReport(MissedFlightException::class);
  3. $exceptions->report(function (InvalidOrderException $e) {
  4. // ...
  5. });
  6. })

基础 Controller
新 Laravel 应用程序中包含的基础控制器已被简化。它不再继承 Laravel 的内部 php Controller 类,并且 php AuthorizesRequestsphp ValidatesRequests traits 也被移除,因为它们可以在需要时包含在应用程序的各个控制器中:

  1. <?php
  2. namespace App\Http\Controllers;
  3. abstract class Controller
  4. {
  5. //
  6. }

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

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

Laravel Reverb

Laravel Reverb 由 Joe Dixon 开发。

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

  1. php artisan reverb:start

此外,Reverb 支持通过 Redis 的发布/订阅功能进行水平扩展,使您能够将 WebSocket 流量分布在多个后端 Reverb 服务器上,从而支持单个高需求应用程序。

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

每秒速率限制

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

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

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

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

健康检查路由

健康检查路由由 Taylor Otwell 贡献。

新的 Laravel 11 应用程序包括一个 php health 路由指令,该指令指示 Laravel 定义一个简单的健康检查端点,供第三方应用程序健康监控服务或编排系统(如 Kubernetes)调用。默认情况下,该路由位于 php /up

  1. ->withRouting(
  2. web: __DIR__.'/../routes/web.php',
  3. commands: __DIR__.'/../routes/console.php',
  4. health: '/up',
  5. )

当 HTTP 请求发到这个路由时,Laravel 还会调度一个 php DiagnosingHealth 事件,使您能够执行与应用程序相关的额外健康检查。

平滑的加密密钥轮换

平滑的加密密钥轮换由 Taylor Otwell 贡献。

由于 Laravel 加密了所有的 cookies,包括应用程序的会话 cookie,因此基本上每个对 Laravel 应用程序的请求都依赖于加密。然而,正因为如此,轮换应用程序的加密密钥会使所有用户退出登录。此外,使用先前加密密钥加密的数据也将无法解密。

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

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

这种平滑的解密方法允许用户在加密密钥轮换时继续不间断地使用您的应用程序。

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

自动密码重新哈希

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

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

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

提示验证

提示验证集成由 Andrea Marco Sartori 贡献。

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

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

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

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

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

队列交互测试

队列交互测试由 Taylor Otwell 贡献。

之前,尝试测试一个队列作业是否被释放、删除或手动失败是非常繁琐的,并且需要定义自定义的队列伪造和存根。然而,在 Laravel 11 中,您可以使用 php withFakeQueueInteractions 方法轻松测试这些队列交互:

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

有关测试队列作业的更多信息,请查看 队列文档。

新的 Artisan 命令

类创建 Artisan 命令由 Taylor Otwell 贡献。

新增了一些 Artisan 命令,允许快速创建类、枚举、接口和特性:

  1. php artisan make:class
  2. php artisan make:enum
  3. php artisan make:interface
  4. php artisan make:trait

模型转换改进

模型转换改进由 Nuno Maduro 贡献。

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

  1. /**
  2. * 获取应转换的属性。
  3. *
  4. * @return array<string, string>
  5. */
  6. protected function casts(): array
  7. {
  8. return [
  9. 'options' => AsCollection::using(OptionCollection::class),
  10. // 'options' => AsEncryptedCollection::using(OptionCollection::class),
  11. // 'options' => AsEnumArrayObject::using(OptionEnum::class),
  12. // 'options' => AsEnumCollection::using(OptionEnum::class),
  13. ];
  14. }

有关属性转换的更多信息,请查阅 Eloquent 文档。

一次性函数 once

php once 助手函数由 Taylor OtwellNuno Maduro 贡献。

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

  1. function random(): int
  2. {
  3. return once(function () {
  4. return random_int(1, 1000);
  5. });
  6. }
  7. random(); // 123
  8. random(); // 123 (缓存结果)
  9. random(); // 123 (缓存结果)

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

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

内存数据库测试性能提升由 Anders Jenbo 贡献。

在使用 php :memory:(注意:此处冒号应为英文,但英文符号会触发表情导致显示错误故改为中文冒号!!!) SQLite 数据库进行测试时,Laravel 11 提供了显著的速度提升。为此,Laravel 现在维护对 PHP 的 PDO 对象的引用,并在连接之间重用它,这通常会将总测试运行时间减半。

对 MariaDB 的改进支持

对 MariaDB 的改进支持由 Jonas StaudenmeirJulius Kiekbusch 贡献。

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

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

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

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

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

  1. use Illuminate\Support\Facades\Schema;
  2. $tables = Schema::getTables();
  3. $views = Schema::getViews();
  4. $columns = Schema::getColumns('users');
  5. $indexes = Schema::getIndexes('users');
  6. $foreignKeys = Schema::getForeignKeys('users');