Skip to content

发布说明

版本计划

Laravel和它的其他官方软件包遵循 语义版本控制。主要的框架版本每年都会发布(~2月), 而次要的和补丁版本可能每周都会发布. 次要版本和补丁版本不应该包含破坏性的变化.

从应用程序或包中引用 Laravel 框架或其组件时,应始终使用版本约束,例如 ^9.0,因为 Laravel 的主要版本确实包含重大更改。 但是,我们始终努力确保您可以在一天或更短的时间内更新到新的主要版本。

命名参数

命名的参数不包括在Laravel的向后兼容性准则中. 我们可能会在必要时选择重新命名函数参数,以改善Laravel代码库。因此, 在调用Laravel方法时, 使用命名参数应该谨慎进行, 并理解参数名称在未来可能会改变.

支持政策

对于 LTS 版本,例如 Laravel 9,提供 2 年的 bug 修复和 3 年的安全修复。 这些版本提供了最长的支持和维护窗口。 对于一般版本,提供 18 个月的错误修复和 2 年的安全修复。 对于包括 Lumen 在内的所有其他库,只有最新版本会收到错误修复。 另外,请查看 Laravel 支持 的数据库版本。 .

Version PHP (*) 发布 Bug修复截止 安全修复截止
6 (LTS)(仅限安全修复) 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 (LTS) 8.0 - 8.1 2022年2月8日 2024年2月8日 2025年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 关系类型,例如“Has One Of Many (多取一)”关联。

因此,在当前版本中发布重要新功能的承诺可能会导致未来的“主要”版本主要用于“维护”任务,例如升级上游依赖项,这可以在这些发行说明中看到。

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 Mailer

Symfony Mailer 的支持由 Dries VintsJames Brooks, 和 Julius Kiekbusch 提供。

以前的 Laravel 版本使用 Swift Mailer 库来发送外发电子邮件。但是,该库不再维护,并由 Symfony Mailer 接替。

请查看升级指南以了解有关确保您的应用程序与 Symfony Mailer 兼容的更多信息。

Flysystem 3.x

Flysystem 3.x 支持由 Dries Vints提供

Laravel 9.x 将我们上游的 Flysystem 依赖升级到 Flysystem 3.x。 Flysystem 为 Storage 门面提供的所有文件系统交互提供支持。

请查看升级指南,了解更多关于确保您的应用程序与Flysystem 3.x兼容的信息。

改进的Eloquent 访问器/修改器

Taylor Otwell 贡献了改进的 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 属性转换

{note} 枚举转换仅适用于 PHP 8.1+。

枚举转换由 Mohamed Said贡献

Eloquent 现在允许您将属性值转换为 PHP 枚举。为此,您可以在模型的$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贡献

PHP 8.1 引入了对Enums 枚举的支持。 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贡献

在之前的 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 限定“child”绑定。 为此,您可以在定义路由时调用 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贡献

您现在可以使用该 controller 方法为组内的所有路由定义公共控制器。然后,在定义路由时,您只需要提供它们调用的控制器方法:

use App\Http\Controllers\OrderController;
 
Route::controller(OrderController::class)->group(function () {
Route::get('/orders/{id}', 'show');
Route::post('/orders', 'store');
});

全文索引 / Where 子句

全文索引和“where”子句由 Taylor OtwellDries Vints提供

当使用 MySQL 或 PostgreSQL 时,该fullText方法现在可以添加到列定义中以生成全文索引:

$table->text('bio')->fullText();

此外,whereFullTextorWhereFullText方法可用于将全文“where”子句添加到具有全文索引 的列的查询中。这些方法将被 Laravel 转换成适合底层数据库系统的 SQL。例如,MATCH AGAINST 将为使用 MySQL 的应用程序生成一个子句:

$users = DB::table('users')
->whereFullText('bio', 'web developer')
->get();

Laravel Scout数据库引擎

Laravel Scout 数据库引擎由 Taylor OtwellDries Vints贡献

如果您的应用程序与中小型数据库交互或工作负载较轻,您现在可以使用 Scout 的“数据库”引擎,而不是 Algolia 或 MeiliSerach 等专用搜索服务。 数据库引擎将在过滤现有数据库的结果时使用“where like”子句和全文索引,以确定查询的适用搜索结果。

要了解有关 Scout 数据库引擎的更多信息,请参阅 Scout 文档

渲染内联 Blade 模板

渲染内联 Blade 模板由 Jason Beggs贡献。 渲染内联 Blade 组件由 Toby Zerner贡献

有时你可能需要将一个原始的Blade模板字符串转换成有效的HTML。你可以使用Blade Facade提供的 render 方法来完成这个任务。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提供。

在以前的Laravel版本中, 槽的名字是用 x-slot 标签的 name 属性来提供的:

<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>

Checked / Selected Blade 指令

Checked 和 selected Blade 指令 由 Ash AllenTaylor Otwell提供

为了方便起见,你现在可以使用@checked指令来轻松地表明一个给定的HTML复选框输入是否被 "选中"。如果所提供的条件评估为 true,该指令将回复 checked

<input type="checkbox"
name="active"
value="active"
@checked(old('active', $user->active)) />

同样地,@selected 指令可以用来指示一个给定的选择选项是否应该被 "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提供

Laravel 现在包含使用 Bootstrap 5 构建的分页视图。要使用这些视图而不是默认的 Tailwind 视图,您可以在类的方法中调用分页器的 useBootstrapFive 方法:App\Providers\AppServiceProvider

use Illuminate\Pagination\Paginator;
 
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Paginator::useBootstrapFive();
}

改进了嵌套数组数据的验证

Steve Bauman贡献了对嵌套数组输入的改进验证

有时,在为属性分配验证规则时,您可能需要访问给定嵌套数组元素的值。 您现在可以使用 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

The Laravel Breeze API 脚手架 和 Next.js 入门套件由 Taylor OtwellMiguel Piedrafita贡献

Laravel Breeze 入门套件已经获得了“API”脚手架模式和免费的 Next.js 前端效果。这个初学者工具包脚手架可用于快速启动用作后端的 Laravel 应用程序,以及用于 JavaScript 前端的 Laravel Sanctum 认证 API。

改进的 Ignition 异常页面

Ignition 由 Spatie开发。

Spatie 创建的开源异常调试页面 Ignition 已经从头开始重新设计。 新的、改进的 Ignition 随 Laravel 9.x 一起提供,包括浅色/深色主题、可定制的“在编辑器中打开”功能等等。

改进 route:list 的 CLI 输出

Nuno Maduro贡献了改进 route:list 的CLI输出.

route:list CLI输出在Laravel 9.x版本中得到了很大的改进,在探索你的路由定义时提供了一个美妙的新体验。

使用Artisan test命令进行测试覆盖

使用 Artisan test 命令时的测试覆盖率由 Nuno Maduro提供.

Artisan test 命令收到了一个新的 --coverage 选项,您可以使用该选项来探索您的测试为您的应用程序提供的代码覆盖率:

php artisan test --coverage

测试覆盖率结果将直接显示在 CLI 输出中。

此外,如果你想指定一个测试覆盖率必须满足的最小阈值,你可以使用--min选项。如果没有达到给定的最小阈值,测试套件将失败:

php artisan test --coverage --min=80.3

Soketi Echo Server

Soketi Echo 服务器由 Alex Renoki开发

虽然不是Laravel 9.x独有的,但Laravel最近协助编写了Soketi的文档,这是一个为Node.js编写的Laravel Echo兼容的Web Socket服务器。Soketi为那些喜欢管理自己的Web Socket服务器的应用程序提供了一个伟大的,开源的Pusher和Ably的替代品。

有关使用 Soketi 的更多信息,请参阅 广播文档Soketi文档.

改进的集合 IDE 支持

Nuno Maduro贡献了改进的集合 IDE 支持

Laravel 9.x adds improved, "generic" style type definitions to the collections component, improving IDE and static analysis support. IDEs such as PHPStorm or static analysis tools such as PHPStan will now better understand Laravel collections natively.

新辅助函数

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']);