发行说明
版本控制方案
Laravel 及其其他第一方软件包遵循 语义化版本控制。主要框架版本每年发布一次(~Q1),而次要版本和补丁版本可能每周发布一次。次要版本和补丁版本**绝不**包含破坏性更改。
当从您的应用程序或软件包引用 Laravel 框架或其组件时,您应该始终使用诸如 ^11.0
之类的版本约束,因为 Laravel 的主要版本确实包含破坏性更改。但是,我们努力始终确保您可以在一天或更短的时间内更新到新的主要版本。
命名参数
命名参数 不在 Laravel 的向后兼容性指南的范围内。我们可能会在必要时选择重命名函数参数,以改进 Laravel 代码库。因此,在调用 Laravel 方法时使用命名参数应该谨慎进行,并了解参数名称将来可能会更改。
支持策略
对于所有 Laravel 版本,bug 修复提供 18 个月,安全修复提供 2 年。对于包括 Lumen 在内的所有其他库,只有最新的主要版本会收到 bug 修复。此外,请查看 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.4 | 2024 年 3 月 12 日 | 2025 年 9 月 3 日 | 2026 年 3 月 12 日 |
12 | 8.2 - 8.4 | 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 Otwell 和 Nuno 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 11 不再包含默认 Laravel 应用程序结构中的五个服务提供者,而只包含一个 AppServiceProvider
。以前的服务提供者的功能已合并到 bootstrap/app.php
中,由框架自动处理,或者可以放置在应用程序的 AppServiceProvider
中。
例如,现在默认启用事件发现,这在很大程度上消除了手动注册事件及其侦听器的需要。但是,如果您确实需要手动注册事件,您可以简单地在 AppServiceProvider
中进行。类似地,您可能以前在 AuthServiceProvider
中注册的路由模型绑定或授权门也可以在 AppServiceProvider
中注册。
选择加入 API 和广播路由
api.php
和 channels.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
类,并且已删除 AuthorizesRequests
和 ValidatesRequests
特性,因为如果需要,它们可以包含在应用程序的各个控制器中。
<?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 的发布/订阅功能支持水平扩展,允许您将 WebSocket 流量分发到多个后端 Reverb 服务器,所有服务器都支持一个高需求的应用程序。
有关 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。可以通过 config/hashing.php
配置文件或 BCRYPT_ROUNDS
环境变量调整 bcrypt 哈希的“工作因子”。
通常,随着 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 命令,以允许快速创建类、枚举、接口和 trait
php artisan make:classphp artisan make:enumphp artisan make:interfacephp 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 Otwell 和 Nuno Maduro 贡献。
once
辅助函数执行给定的回调,并将结果缓存在内存中,直到请求结束。随后对具有相同回调的 once
函数的任何调用都将返回先前缓存的结果
function random(): int{ return once(function () { return random_int(1, 1000); });} random(); // 123random(); // 123 (cached result)random(); // 123 (cached result)
有关 once
辅助函数的更多信息,请查看 辅助函数文档。
使用内存数据库进行测试时性能得到提升
内存数据库测试性能的提升由 Anders Jenbo 贡献
在测试期间使用 :memory:
SQLite 数据库时,Laravel 11 提供了显着的加速。为了实现这一点,Laravel 现在维护对 PHP 的 PDO 对象的引用并在连接之间重用它,通常可以将总测试运行时间缩短一半。
对 MariaDB 的改进支持
对 MariaDB 的改进支持由 Jonas Staudenmeir 和 Julius 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');