跳至内容

发行说明

版本控制方案

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

在从你的应用程序或包中引用 Laravel 框架或其组件时,你应始终使用版本约束(如 ^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 新应用程序结构的亮点。

应用程序引导文件

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 进行数据库存储,以及 Laravel 的会话、缓存和队列的 database 驱动程序。这使你可以在创建新的 Laravel 应用程序后立即开始构建应用程序,无需安装其他软件或创建其他数据库迁移。

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

Laravel Reverb

Laravel Reverb 由 Joe Dixon 开发。.

Laravel Reverb 将快速且可扩展的实时 WebSocket 通信直接引入你的 Laravel 应用程序,并提供与 Laravel 现有的事件广播工具套件(如 Laravel Echo)的无缝集成。

php artisan reverb:start

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

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

每秒速率限制

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

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

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

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

健康路由

健康路由由 Taylor Otwell 贡献。

.

新的 Laravel 11 应用包含一个 health 路由指令,它指示 Laravel 定义一个简单的健康检查端点,可以由第三方应用健康监控服务或 Kubernetes 等编排系统调用。默认情况下,此路由位于 /up

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

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

优雅的加密密钥轮换

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

由于 Laravel 对所有 Cookie(包括应用程序的会话 Cookie)进行加密,因此,实际上每个对 Laravel 应用程序的请求都依赖于加密。但是,正因为如此,轮换应用程序的加密密钥会导致所有用户退出应用程序。此外,解密由先前加密密钥加密的数据变得不可能。

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

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

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

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

自动密码重新哈希

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

Laravel 的默认密码哈希算法是 bcrypt。bcrypt 哈希的“工作因子”可以通过 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 贡献。.

以前,尝试测试已发布、删除或手动失败的队列作业很麻烦,并且需要定义自定义队列模拟和存根。但是,在 Laravel 11 中,您可以使用 withFakeQueueInteractions 方法轻松测试这些队列交互。

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

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

新的 Artisan 命令

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

添加了新的 Artisan 命令,以允许快速创建类、枚举、接口和特性。

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

模型转换改进

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

Laravel 11 支持使用方法而不是属性来定义模型的转换。这允许简化流畅的转换定义,尤其是在使用带参数的转换时。

/**
* Get the attributes that should be cast.
*
* @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 OtwellNuno Maduro 贡献。

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

function random(): int
{
return once(function () {
return random_int(1, 1000);
});
}
 
random(); // 123
random(); // 123 (cached result)
random(); // 123 (cached result)

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

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

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

在测试期间使用 :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 提供了额外的数据库模式操作和检查方法,包括本机修改、重命名和删除列。此外,还提供了高级空间类型、非默认模式名称以及用于操作表、视图、列、索引和外键的本机模式方法。

use Illuminate\Support\Facades\Schema;
 
$tables = Schema::getTables();
$views = Schema::getViews();
$columns = Schema::getColumns('users');
$indexes = Schema::getIndexes('users');
$foreignKeys = Schema::getForeignKeys('users');