# 发行说明
# 版本控制方案
Laravel 和它的其他第一方包遵循语义版本控制 (opens new window)。主要框架版本每年(~2 月)发布,而次要和补丁版本可能每周发布一次。次要版本和补丁版本不应包含重大更改。
从应用程序或包中引用 Laravel 框架或其组件时,您应该始终使用版本约束,例如^9.0
,因为 Laravel 的主要版本确实包含重大更改。但是,我们始终努力确保您可以在一天或更短的时间内更新到新的主要版本。
# 命名参数
Laravel 的向后兼容性指南不涵盖命名参数 (opens new window) 。我们可以在必要时选择重命名函数参数以改进 Laravel 代码库。因此,在调用 Laravel 方法时应谨慎使用命名参数,并了解参数名称将来可能会更改。
# 支持政策
对于所有 Laravel 版本,提供 18 个月的错误修复和 2 年的安全修复。对于包括 Lumen 在内的所有其他库,只有最新版本会收到错误修复。另外,请查看Laravel 支持 (opens new window)的数据库版本。
版本 | PHP (*) | 发布 | 错误修复直到 | 安全修复直到 |
---|---|---|---|---|
6 (长期) | 7.2 - 8.0 | 2019 年 9 月 3 日 | 2022 年 1 月 25 日 | 2022 年 9 月 6 日 |
7 | 7.2 - 8.0 | 2020 年 3 月 3 日 | 2020 年 10 月 6 日 | 2021 年 3 月 3 日 |
8 | 7.3 - 8.1 | 2020 年 9 月 8 日 | 2022 年 7 月 26 日 | 2023 年 1 月 24 日 |
9 | 8.0 - 8.1 | 2022 年 2 月 8 日 | 2023 年 8 月 8 日 | 2024 年 2 月 8 日 |
10 | 8.0 - 8.1 | 2023 年 2 月 7 日 | 2024 年 8 月 7 日 | 2025 年 2 月 7 日 |
生命尽头
仅安全修复
(*) 支持的 PHP 版本
# Laravel 9
你可能知道,随着 Laravel 8 的发布,Laravel 过渡到了年度发布。以前,主要版本每 6 个月发布一次。这种转变旨在减轻社区的维护负担,并挑战我们的开发团队在不引入重大更改的情况下发布令人惊叹的强大新功能。因此,我们在不破坏向后兼容性的情况下向 Laravel 8 提供了各种强大的功能,例如并行测试支持、改进的 Breeze 入门工具包、HTTP 客户端改进,甚至是新的 Eloquent 关系类型,例如“具有多个中的一个”。
因此,在当前版本中发布重要新功能的承诺可能会导致未来的“主要”版本主要用于“维护”任务,例如升级上游依赖项,这可以在这些版本说明中看到。
Laravel 9 通过引入对 Symfony 6.0 组件、Symfony Mailer、Flysystem 3.0 的支持、改进route:list
的输出、Laravel Scout 数据库驱动程序、新的 Eloquent 访问器/修改器语法、通过枚举的隐式路由绑定以及各种其他错误修复和可用性改进。
# PHP 8.0
Laravel 9.x 要求最低 PHP 版本为 8.0。
# Symfony 邮件程序
Symfony Mailer 的支持由Dries Vints (opens new window)、James Brooks (opens new window)和Julius Kiekbusch 提供 (opens new window)。
以前的 Laravel 版本使用Swift Mailer (opens new window)库来发送外发电子邮件。但是,该库不再维护,并由 Symfony Mailer 接替。
请查看升级指南 (opens new window)以了解有关确保您的应用程序与 Symfony Mailer 兼容的更多信息。
# Flysystem 3.x
Flysystem 3.x 支持由Dries Vints 提供 (opens new window)。
Laravel 9.x 将我们上游的 Flysystem 依赖升级到 Flysystem 3.x。Flysystem 为Storage
外观提供的所有文件系统交互提供支持。
请查看升级指南 (opens new window)以了解有关确保您的应用程序与 Flysystem 3.x 兼容的更多信息。
# 改进的 Eloquent Accessors / Mutators
*Taylor Otwell (opens new window)**贡献了改进的 Eloquent 访问器/*修改器。
Laravel 9.x 提供了一种定义 Eloquent访问器和修改器的新方法。在以前的 Laravel 版本中,定义访问器和修改器的唯一方法是在模型上定义前缀方法,如下所示:
public function getNameAttribute($value)
{
return strtoupper($value);
}
public function setNameAttribute($value)
{
$this->attributes['name'] = $value;
}
然而,在 Laravel 9.x 中,你可以使用一个单一的、无前缀的方法通过类型提示返回类型来定义访问器和修改器Illuminate\Database\Eloquent\Casts\Attribute
:
use Illuminate\Database\Eloquent\Casts\Attribute;
public function name(): Attribute
{
return new Attribute(
get: fn ($value) => strtoupper($value),
set: fn ($value) => $value,
);
}
此外,这种定义访问器的新方法将缓存属性返回的对象值,就像自定义转换类一样:
use App\Support\Address;
use Illuminate\Database\Eloquent\Casts\Attribute;
public function address(): Attribute
{
return new Attribute(
get: fn ($value, $attributes) => new Address(
$attributes['address_line_one'],
$attributes['address_line_two'],
),
set: fn (Address $value) => [
'address_line_one' => $value->lineOne,
'address_line_two' => $value->lineTwo,
],
);
}
# Enum Eloquent 属性转换
枚举转换仅适用于 PHP 8.1+。
*枚举铸造由Mohamed Said (opens new window)*贡献。
Eloquent 现在允许您将属性值转换为 PHP “支持”枚举 (opens new window)。为此,您可以在模型的$casts
属性数组中指定要强制转换的属性和枚举:
use App\Enums\ServerStatus;
/**
* The attributes that should be cast.
*
* @var array
*/
protected $casts = [
'status' => ServerStatus::class,
];
一旦你在你的模型上定义了转换,当你与属性交互时,指定的属性将自动转换为枚举:
if ($server->status == ServerStatus::provisioned) {
$server->status = ServerStatus::ready;
$server->save();
}
# 使用枚举的隐式路由绑定
*隐式枚举绑定由Nuno Maduro (opens new window)*贡献。
PHP 8.1 引入了对Enums (opens new window)的支持。Laravel 9.x 引入了在路由定义中键入提示 Enum 的能力,并且 Laravel 只会在该路由段是 URI 中的有效 Enum 值时调用该路由。否则,将自动返回 HTTP 404 响应。例如,给定以下枚举:
enum Category: string
{
case Fruits = 'fruits';
case People = 'people';
}
{category}
您可以定义仅当路由段为fruits
或时才会调用的路由people
。否则,将返回 HTTP 404 响应:
Route::get('/categories/{category}', function (Category $category) {
return $category->value;
});
# 路由绑定的强制范围
*强制范围绑定由Claudio Dekker (opens new window)*贡献。
在之前的 Laravel 版本中,您可能希望在路由定义中限定第二个 Eloquent 模型,使其必须是之前 Eloquent 模型的子模型。例如,考虑这个通过 slug 为特定用户检索博客文章的路由定义:
use App\Models\Post;
use App\Models\User;
Route::get('/users/{user}/posts/{post:slug}', function (User $user, Post $post) {
return $post;
});
当使用自定义键控隐式绑定作为嵌套路由参数时,Laravel 将自动限定查询范围以通过其父级检索嵌套模型,使用约定来猜测父级上的关系名称。但是,当自定义键用于子路由绑定时,Laravel 之前仅支持此行为。
然而,在 Laravel 9.x 中,即使没有提供自定义键,你现在也可以指示 Laravel 限定“子”绑定。为此,您可以scopeBindings
在定义路由时调用该方法:
use App\Models\Post;
use App\Models\User;
Route::get('/users/{user}/posts/{post}', function (User $user, Post $post) {
return $post;
})->scopeBindings();
或者,您可以指示整个路由定义组使用范围绑定:
Route::scopeBindings()->group(function () {
Route::get('/users/{user}/posts/{post}', function (User $user, Post $post) {
return $post;
});
});
# 控制器路由组
*路线组改进由Luke Downing (opens new window)*贡献。
您现在可以使用该controller
方法为组内的所有路由定义公共控制器。然后,在定义路由时,您只需要提供它们调用的控制器方法:
use App\Http\Controllers\OrderController;
Route::controller(OrderController::class)->group(function () {
Route::get('/orders/{id}', 'show');
Route::post('/orders', 'store');
});
# 全文索引 / Where 子句
全文索引和“where”子句由Taylor Otwell (opens new window)和Dries Vints 提供 (opens new window)。
当使用 MySQL 或 PostgreSQL 时,该fullText
方法现在可以添加到列定义中以生成全文索引:
$table->text('bio')->fullText();
此外,whereFullText
andorWhereFullText
方法可用于将全文“where”子句添加到具有全文索引 (opens new window)的列的查询中。这些方法将被 Laravel 转换成适合底层数据库系统的 SQL。例如,MATCH AGAINST
将为使用 MySQL 的应用程序生成一个子句:
$users = DB::table('users')
->whereFullText('bio', 'web developer')
->get();
# Laravel Scout 数据库引擎
Laravel Scout 数据库引擎由Taylor Otwell (opens new window)和Dries Vints 贡献 (opens new window)。
如果您的应用程序与中小型数据库交互或工作量较小,您现在可以使用 Scout 的“数据库”引擎,而不是 Algolia 或 MeiliSearch 等专用搜索服务。数据库引擎将在过滤现有数据库的结果时使用“where like”子句和全文索引,以确定查询的适用搜索结果。
要了解有关 Scout 数据库引擎的更多信息,请参阅Scout 文档 (opens new window)。
# 渲染内联blade
*渲染内联 Blade 模板由Jason Beggs (opens new window)贡献。渲染内联 Blade 组件由Toby Zerner (opens new window)*贡献。
有时您可能需要将原始 Blade 模板字符串转换为有效的 HTML。您可以使用外观render
提供的方法来完成此操作。Blade
该render
方法接受 Blade 模板字符串和提供给模板的可选数据数组:
use Illuminate\Support\Facades\Blade;
return Blade::render('Hello, {{ $name }}', ['name' => 'Julian Bashir']);
类似地,该renderComponent
方法可用于通过将组件实例传递给该方法来呈现给定的类组件:
use App\View\Components\HelloComponent;
return Blade::renderComponent(new HelloComponent('Julian Bashir'));
# 插槽名称快捷方式
插槽名称快捷方式由Caleb Porzio (opens new window)提供。
在以前的 Laravel 版本中,插槽名称是使用标签name
上的属性提供的:x-slot
<x-alert>
<x-slot name="title">
Server Error
</x-slot>
<strong>Whoops!</strong> Something went wrong!
</x-alert>
但是,从 Laravel 9.x 开始,您可以使用更方便、更短的语法来指定插槽的名称:
<x-slot:title>
Server Error
</x-slot>
# 检查/可选的blade指令
检查和选择的 Blade 指令由Ash Allen (opens new window)和Taylor Otwell 提供 (opens new window)。
为方便起见,您现在可以使用该@checked
指令轻松指示给定的 HTML 复选框输入是否被“选中”。checked
如果提供的条件评估为:此指令将回显true
:
<input type="checkbox"
name="active"
value="active"
@checked(old('active', $user->active)) />
同样,该@selected
指令可用于指示是否应该“选择”给定的选择选项:
<select name="version">
@foreach ($product->versions as $version)
<option value="{{ $version }}" @selected(old('version') == $version)>
{{ $version }}
</option>
@endforeach
</select>
# Bootstrap 5 分页视图
*Bootstrap 5 分页视图由Jared Lewis (opens new window)*贡献。
Laravel 现在包含使用Bootstrap 5 (opens new window)构建的分页视图。要使用这些视图而不是默认的 Tailwind 视图,您可以在类的方法中调用分页器的useBootstrapFive
方法:boot``App\Providers\AppServiceProvider
use Illuminate\Pagination\Paginator;
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Paginator::useBootstrapFive();
}
# 改进了嵌套数组数据的验证
*Steve Bauman (opens new window)*贡献了对嵌套数组输入的改进验证。
有时,在为属性分配验证规则时,您可能需要访问给定嵌套数组元素的值。您现在可以使用该Rule::forEach
方法完成此操作。该forEach
方法接受一个闭包,该闭包将为验证下的数组属性的每次迭代调用,并将接收属性的值和显式的、完全扩展的属性名称。闭包应该返回一个规则数组来分配给数组元素:
use App\Rules\HasPermission;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
$validator = Validator::make($request->all(), [
'companies.*.id' => Rule::forEach(function ($value, $attribute) {
return [
Rule::exists(Company::class, 'id'),
new HasPermission('manage-company', $value),
];
}),
]);
# Laravel Breeze API 和 Next.js
*Laravel Breeze API 脚手架和 Next.js 入门套件由Taylor Otwell (opens new window)和Miguel Piedrafita (opens new window)*贡献。
Laravel Breeze (opens new window)入门套件已经获得了“API”脚手架模式和免费的 Next.js (opens new window) 前端实现 (opens new window)。这个初学者工具包脚手架可用于快速启动用作后端的 Laravel 应用程序,以及用于 JavaScript 前端的 Laravel Sanctum 认证 API。
# 改进的异常页面
Spatie 创建的开源异常调试页面 Ignition 已经从头开始重新设计。新的、改进的 Ignition 随 Laravel 9.x 一起提供,包括浅色/深色主题、可定制的“在编辑器中打开”功能等等。
# 改进route:list
的 CLI 输出
Nuno Maduro (opens new window)贡献了改进route:list
的 CLI 输出。
route:list
Laravel 9.x 版本的CLI 输出得到了显着改进,在探索你的路由定义时提供了一种美妙的新体验。
# test
使用 Artisan命令测试覆盖率
*使用 Artisantest
命令时的测试覆盖率由Nuno Maduro (opens new window)*提供。
Artisantest
命令收到了一个新--coverage
选项,您可以使用该选项来探索您的测试为您的应用程序提供的代码覆盖率:
php artisan test --coverage
测试覆盖率结果将直接显示在 CLI 输出中。
此外,如果您想指定测试覆盖率必须满足的最低阈值,您可以使用该--min
选项。如果未达到给定的最小阈值,则测试套件将失败:
php artisan test --coverage --min=80.3
# Soketi Echo 服务器
*Soketi Echo 服务器由Alex Renoki (opens new window)*开发。
虽然不是 Laravel 9.x 独有的,但 Laravel 最近协助编写了 Soketi 的文档,这是一个为 Node.js 编写的与Laravel Echo (opens new window)兼容的 Web Socket 服务器。Soketi 为那些喜欢管理自己的 Web Socket 服务器的应用程序提供了一个很好的、开源的替代 Pusher 和 Ably。
有关使用 Soketi 的更多信息,请参阅广播文档 (opens new window)和Soketi 文档 (opens new window)。
# 改进的集合 IDE 支持
*Nuno Maduro (opens new window)*贡献了改进的集合 IDE 支持。
Laravel 9.x 为集合组件添加了改进的“通用”样式类型定义,改进了 IDE 和静态分析支持。PHPStorm等 IDE或PHPStan (opens new window)等静态分析工具现在可以更好地理解 Laravel 集合。 (opens new window)
# 新助手
Laravel 9.x 引入了两个新的、方便的辅助函数,你可以在自己的应用程序中使用它们。
# str
该str
函数返回Illuminate\Support\Stringable
给定字符串的新实例。这个函数等价于Str::of
方法:
$string = str('Taylor')->append(' Otwell');
// 'Taylor Otwell'
如果没有为str
函数提供参数,则函数返回 的实例Illuminate\Support\Str
:
$snake = str()->snake('LaravelFramework');
// 'laravel_framework'
# to_route
该to_route
函数为给定的命名路由生成重定向 HTTP 响应,提供了一种从路由和控制器重定向到命名路由的表达方式:
return to_route('users.show', ['user' => 1]);
如有必要,您可以将应分配给重定向的 HTTP 状态代码和任何其他响应标头作为第三和第四个参数传递给 to_route 方法:
return to_route('users.show', ['user' => 1], 302, ['X-Framework' => 'Laravel']);[
升级指南 →