Laravel 9.x重磅新特性解析
好的Laravel 9.x 版本引入了多项重要的新特性和改进。以下是一些主要特性最低 PHP 版本要求提升Laravel 9.x 要求PHP 8.0或更高版本。这利用了 PHP 8 的新特性如联合类型、命名参数、属性等。Eloquent 访问器/修改器的改进现在定义访问器和修改器时不再需要get...Attribute/set...Attribute方法的前缀。只需在模型中定义一个方法并使用Illuminate\Database\Eloquent\Casts\Attribute类型来返回结果。例如use 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(会触发修改器)。控制器路由的新语法 (推荐)在定义路由时推荐使用更简洁的语法来指定控制器和其方法use App\Http\Controllers\UserController; Route::get(/user, [UserController::class, index]);之前的字符串语法UserControllerindex仍然可用但[UserController::class, index]是 Laravel 9 及以后版本推荐的方式支持更好的 IDE 自动完成和重构。路由模型绑定作用域现在可以更轻松地定义路由模型绑定的作用域父模型的约束。例如一个User拥有多个Post要获取特定用户下的特定帖子Route::get(/users/{user}/posts/{post}, function (User $user, Post $post) { return $post; })-scopeBindings();这里的{post}参数会自动限定在$user-posts()关联关系下查询确保$post属于$user。也可以在路由组上使用scopeBindings。可选的路由模型绑定自定义键现在可以在路由参数中指定用于模型绑定的数据库列名而不仅仅是id。例如使用slug来绑定Post模型Route::get(/posts/{post:slug}, function (Post $post) { return $post; });EnumEloquent 属性转换新增了对 PHP 8.1enum的内置支持作为 Eloquent 属性转换。例如use App\Enums\ServerStatus; protected $casts [ status ServerStatus::class, ];存储时枚举的值通常是字符串或整数会被保存到数据库读取时会自动转换回对应的枚举实例。测试辅助函数的改进assertStatus方法现在接受任何有效的 HTTP 状态码而不仅仅是预定义的常量。$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用于将文件内容流式传输到浏览器例如下载大文件。return Storage::disk(s3)-stream(file.jpg);Flysystem 升级至第 3 版Laravel 的文件存储系统底层使用的 Flysystem 库升级到了第 3 版 (league/flysystem:^3.0)。这带来了更好的类型提示和错误处理。useBlade 指令新增了useBlade 指令用于在模板中导入 PHP 类或命名空间类似于 PHP 的use语句。use(App\Models\User) ... pWelcome, {{ User::find(Auth::id())-name }}!/pboot方法中的调度器访问现在可以在服务提供者的boot方法中直接访问调度器实例方便注册计划任务public function boot() { $this-app-booted(function () { $schedule $this-app-make(Schedule::class); $schedule-command(some:command)-daily(); }); }when/unless查询构造器方法新增了when和unless方法提供更流畅的条件查询构建方式。$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 的官方升级指南和文档以获取完整列表和详细说明。