好的,Laravel 9.x 版本引入了多项重要的新特性和改进。以下是一些主要特性:
-
最低 PHP 版本要求提升
- Laravel 9.x 要求 PHP 8.0 或更高版本。
- 这利用了 PHP 8 的新特性,如联合类型、命名参数、属性等。
-
Eloquent 访问器/修改器的改进
-
现在定义访问器和修改器时,不再需要
get...Attribute/set...Attribute方法的前缀。 -
只需在模型中定义一个方法,并使用
Illuminate\Database\Eloquent\Casts\Attribute类型来返回结果。 -
例如:
phpuse Illuminate\Database\Eloquent\Casts\Attribute; public function name(): Attribute { return new Attribute( get: fn ($value) => ucfirst($value), set: fn ($value) => strtolower($value), ); } -
使用方式不变:
$user->name(会触发访问器) 或$user->name = 'value'(会触发修改器)。
-
-
控制器路由的新语法 (推荐)
-
在定义路由时,推荐使用更简洁的语法来指定控制器和其方法:
phpuse App\Http\Controllers\UserController; Route::get('/user', [UserController::class, 'index']); -
之前的字符串语法
'UserController@index'仍然可用,但[UserController::class, 'index']是 Laravel 9 及以后版本推荐的方式,支持更好的 IDE 自动完成和重构。
-
-
路由模型绑定作用域
-
现在可以更轻松地定义路由模型绑定的作用域(父模型的约束)。
-
例如,一个
User拥有多个Post,要获取特定用户下的特定帖子:phpRoute::get('/users/{user}/posts/{post}', function (User $user, Post $post) { return $post; })->scopeBindings();- 这里的
{post}参数会自动限定在$user->posts()关联关系下查询,确保$post属于$user。 - 也可以在路由组上使用
scopeBindings。
- 这里的
-
-
可选的路由模型绑定自定义键
-
现在可以在路由参数中指定用于模型绑定的数据库列名(而不仅仅是
id)。 -
例如,使用
slug来绑定Post模型:phpRoute::get('/posts/{post:slug}', function (Post $post) { return $post; });
-
-
EnumEloquent 属性转换-
新增了对 PHP 8.1
enum的内置支持作为 Eloquent 属性转换。 -
例如:
phpuse App\Enums\ServerStatus; protected $casts = [ 'status' => ServerStatus::class, ]; -
存储时,枚举的值(通常是字符串或整数)会被保存到数据库;读取时,会自动转换回对应的枚举实例。
-
-
测试辅助函数的改进
-
assertStatus方法现在接受任何有效的 HTTP 状态码,而不仅仅是预定义的常量。php$response->assertStatus(200); $response->assertStatus(419); // 例如 CSRF 令牌不匹配 -
新增了
assertHasExactErrors方法,用于精确断言验证错误信息。
-
-
Illuminate\Support\Stringable的改进- 新增了多个便捷的字符串操作方法,如
whenContains、whenContainsAll、is、isAscii、isUuid、whenIs、whenIsAscii、whenIsUuid、test、whenTest等。
- 新增了多个便捷的字符串操作方法,如
-
Symfony Mailer 替换 Swift Mailer
- 由于 Swift Mailer 已停止维护,Laravel 9 将默认的邮件传输层从 Swift Mailer 切换到了 Symfony Mailer。对于大多数应用来说,这个切换应该是无缝的。
-
stream方法(文件存储)-
新增了
stream方法到Storagefacade,用于将文件内容流式传输到浏览器(例如下载大文件)。phpreturn Storage::disk('s3')->stream('file.jpg');
-
-
Flysystem 升级至第 3 版
- Laravel 的文件存储系统底层使用的 Flysystem 库升级到了第 3 版 (
league/flysystem:^3.0)。这带来了更好的类型提示和错误处理。
- Laravel 的文件存储系统底层使用的 Flysystem 库升级到了第 3 版 (
-
@useBlade 指令-
新增了
@useBlade 指令,用于在模板中导入 PHP 类或命名空间,类似于 PHP 的use语句。blade@use('App\Models\User') ... <p>Welcome, {{ User::find(Auth::id())->name }}!</p>
-
-
boot方法中的调度器访问-
现在可以在服务提供者的
boot方法中直接访问调度器实例,方便注册计划任务:phppublic function boot() { $this->app->booted(function () { $schedule = $this->app->make(Schedule::class); $schedule->command('some:command')->daily(); }); }
-
-
when/unless查询构造器方法-
新增了
when和unless方法,提供更流畅的条件查询构建方式。php$users = DB::table('users') ->when($request->filled('search'), function ($query) use ($request) { return $query->where('name', 'like', '%'.$request->search.'%'); }) ->get();
-
-
make:model命令改进-a选项现在会生成迁移文件、工厂类、资源控制器、策略类以及模型。
发布时间: Laravel 9 于 2022 年 2 月发布。
这些是 Laravel 9.x 中一些最显著的特性。建议查看 Laravel 9.x 的官方升级指南和文档以获取完整列表和详细说明。