好的,Laravel 9.x 版本引入了多项重要的新特性和改进。以下是一些主要特性:

  1. 最低 PHP 版本要求提升

    • Laravel 9.x 要求 PHP 8.0 或更高版本。
    • 这利用了 PHP 8 的新特性,如联合类型、命名参数、属性等。
  2. 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' (会触发修改器)。
  3. 控制器路由的新语法 (推荐)

    • 在定义路由时,推荐使用更简洁的语法来指定控制器和其方法:
      use App\Http\Controllers\UserController;
      
      Route::get('/user', [UserController::class, 'index']);
      

    • 之前的字符串语法 'UserController@index' 仍然可用,但 [UserController::class, 'index'] 是 Laravel 9 及以后版本推荐的方式,支持更好的 IDE 自动完成和重构。
  4. 路由模型绑定作用域

    • 现在可以更轻松地定义路由模型绑定的作用域(父模型的约束)。
    • 例如,一个 User 拥有多个 Post,要获取特定用户下的特定帖子:
      Route::get('/users/{user}/posts/{post}', function (User $user, Post $post) {
          return $post;
      })->scopeBindings();
      

      • 这里的 {post} 参数会自动限定在 $user->posts() 关联关系下查询,确保 $post 属于 $user
      • 也可以在路由组上使用 scopeBindings
  5. 可选的路由模型绑定自定义键

    • 现在可以在路由参数中指定用于模型绑定的数据库列名(而不仅仅是 id)。
    • 例如,使用 slug 来绑定 Post 模型:
      Route::get('/posts/{post:slug}', function (Post $post) {
          return $post;
      });
      

  6. Enum Eloquent 属性转换

    • 新增了对 PHP 8.1 enum 的内置支持作为 Eloquent 属性转换。
    • 例如:
      use App\Enums\ServerStatus;
      
      protected $casts = [
          'status' => ServerStatus::class,
      ];
      

    • 存储时,枚举的值(通常是字符串或整数)会被保存到数据库;读取时,会自动转换回对应的枚举实例。
  7. 测试辅助函数的改进

    • assertStatus 方法现在接受任何有效的 HTTP 状态码,而不仅仅是预定义的常量。
      $response->assertStatus(200);
      $response->assertStatus(419); // 例如 CSRF 令牌不匹配
      

    • 新增了 assertHasExactErrors 方法,用于精确断言验证错误信息。
  8. Illuminate\Support\Stringable 的改进

    • 新增了多个便捷的字符串操作方法,如 whenContainswhenContainsAllisisAsciiisUuidwhenIswhenIsAsciiwhenIsUuidtestwhenTest 等。
  9. Symfony Mailer 替换 Swift Mailer

    • 由于 Swift Mailer 已停止维护,Laravel 9 将默认的邮件传输层从 Swift Mailer 切换到了 Symfony Mailer。对于大多数应用来说,这个切换应该是无缝的。
  10. stream 方法(文件存储)

    • 新增了 stream 方法到 Storage facade,用于将文件内容流式传输到浏览器(例如下载大文件)。
      return Storage::disk('s3')->stream('file.jpg');
      

  11. Flysystem 升级至第 3 版

    • Laravel 的文件存储系统底层使用的 Flysystem 库升级到了第 3 版 (league/flysystem:^3.0)。这带来了更好的类型提示和错误处理。
  12. @use Blade 指令

    • 新增了 @use Blade 指令,用于在模板中导入 PHP 类或命名空间,类似于 PHP 的 use 语句。
      @use('App\Models\User')
      ...
      <p>Welcome, {{ User::find(Auth::id())->name }}!</p>
      

  13. boot 方法中的调度器访问

    • 现在可以在服务提供者的 boot 方法中直接访问调度器实例,方便注册计划任务:
      public function boot()
      {
          $this->app->booted(function () {
              $schedule = $this->app->make(Schedule::class);
              $schedule->command('some:command')->daily();
          });
      }
      

  14. when / unless 查询构造器方法

    • 新增了 whenunless 方法,提供更流畅的条件查询构建方式。
      $users = DB::table('users')
          ->when($request->filled('search'), function ($query) use ($request) {
              return $query->where('name', 'like', '%'.$request->search.'%');
          })
          ->get();
      

  15. make:model 命令改进

    • -a 选项现在会生成迁移文件、工厂类、资源控制器、策略类以及模型。

发布时间: Laravel 9 于 2022 年 2 月发布。

这些是 Laravel 9.x 中一些最显著的特性。建议查看 Laravel 9.x 的官方升级指南和文档以获取完整列表和详细说明。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐