发布说明
版本方案
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.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 应用程序结构包含五个服务提供者不同,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“内核”类。
调度
使用新的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 的发布/订阅功能支持水平扩展,允许您在多个后端 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: '你的名字是什么?',
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贡献。
之前,尝试测试已释放、删除或手动失败的排队作业是繁琐的,需要定义自定义队列假和存根。然而,在 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),
// AsEncryptedCollection::using(OptionCollection::class),
// AsEnumArrayObject::using(OptionEnum::class),
// AsEnumCollection::using(OptionEnum::class),
];
}
有关属性转换的更多信息,请查看电子文档。
once
函数
once
助手由Taylor Otwell和Nuno Maduro贡献。
once
助手函数执行给定的回调,并在请求期间将结果缓存到内存中。对相同回调的后续调用将返回先前缓存的结果:
function random(): int
{
return once(function () {
return random_int(1, 1000);
});
}
random(); // 123
random(); // 123(缓存结果)
random(); // 123(缓存结果)
有关once
助手的更多信息,请查看助手文档。
使用内存数据库测试时的性能改进
使用内存数据库测试性能改进由Anders Jenbo贡献。
Laravel 11 在使用:memory:
SQLite 数据库进行测试时提供了显著的速度提升。为此,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');