发行说明
发布说明
版本方案
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 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 应用程序结构包含五个服务提供者,而 Laravel 11 仅包含一个 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 “kernel” 类。
任务调度
通过新的 Schedule
facade,现在可以直接在应用程序的 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) {
// ...
});
})
<a>基础 <code>Controller</code> 类</a>
新 Laravel 应用程序中包含的基础控制器已被简化。它不再继承 Laravel 的内部 Controller
类,并且 AuthorizesRequests
和 ValidatesRequests
traits 也被移除,因为它们可以在需要时包含在应用程序的各个控制器中:
<?php
namespace App\Http\Controllers;
abstract class Controller
{
//
}
应用程序默认设置
默认情况下,新 Laravel 应用程序使用 SQLite 进行数据库存储,并使用 database
驱动来处理 Laravel 的会话、缓存和队列。这允许您在创建新 Laravel 应用程序后立即开始构建应用程序,而无需安装额外的软件或创建额外的数据库迁移。
此外,随着时间的推移,这些 Laravel 服务的 database
驱动已经变得足够强大,可以在许多应用程序上下文中用于生产环境;因此,它们为本地和生产应用程序提供了一个合理的、统一的选择。
Laravel Reverb
Laravel Reverb 由 Joe Dixon 开发。
Laravel Reverb 为您的 Laravel 应用程序带来了极速且可扩展的实时 WebSocket 通信,并与 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 加密了所有的 cookies,包括应用程序的会话 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 的 validator 的全部功能:
$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 支持使用方法而不是属性来定义模型的转换。这使得转换定义更加简洁流畅,特别是在使用带参数的转换时:
/**
* 获取应转换的属性。
*
* @return array<string, string>
*/
protected function casts(): array
{
return [
'options' => AsCollection::using(OptionCollection::class),
// 'options' => AsEncryptedCollection::using(OptionCollection::class),
// 'options' => AsEnumArrayObject::using(OptionEnum::class),
// 'options' => AsEnumCollection::using(OptionEnum::class),
];
}
有关属性转换的更多信息,请查阅 Eloquent 文档。
<a>一次性函数 <code>once</code></a>
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 贡献。
在使用 :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');
原文地址:cndocs/11.x/re...
译文地址:cndocs/11.x/re...