Laravel 9.x重磅新特性解析

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

  1. 最低 PHP 版本要求提升

    • Laravel 9.x 要求 PHP 8.0 或更高版本。
    • 这利用了 PHP 8 的新特性,如联合类型、命名参数、属性等。
  2. Eloquent 访问器/修改器的改进

    • 现在定义访问器和修改器时,不再需要 get...Attribute / set...Attribute 方法的前缀。

    • 只需在模型中定义一个方法,并使用 Illuminate\Database\Eloquent\Casts\Attribute 类型来返回结果。

    • 例如:

      php 复制代码
      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. 控制器路由的新语法 (推荐)

    • 在定义路由时,推荐使用更简洁的语法来指定控制器和其方法:

      php 复制代码
      use App\Http\Controllers\UserController;
      
      Route::get('/user', [UserController::class, 'index']);
    • 之前的字符串语法 'UserController@index' 仍然可用,但 [UserController::class, 'index'] 是 Laravel 9 及以后版本推荐的方式,支持更好的 IDE 自动完成和重构。

  4. 路由模型绑定作用域

    • 现在可以更轻松地定义路由模型绑定的作用域(父模型的约束)。

    • 例如,一个 User 拥有多个 Post,要获取特定用户下的特定帖子:

      php 复制代码
      Route::get('/users/{user}/posts/{post}', function (User $user, Post $post) {
          return $post;
      })->scopeBindings();
      • 这里的 {post} 参数会自动限定在 $user->posts() 关联关系下查询,确保 $post 属于 $user
      • 也可以在路由组上使用 scopeBindings
  5. 可选的路由模型绑定自定义键

    • 现在可以在路由参数中指定用于模型绑定的数据库列名(而不仅仅是 id)。

    • 例如,使用 slug 来绑定 Post 模型:

      php 复制代码
      Route::get('/posts/{post:slug}', function (Post $post) {
          return $post;
      });
  6. Enum Eloquent 属性转换

    • 新增了对 PHP 8.1 enum 的内置支持作为 Eloquent 属性转换。

    • 例如:

      php 复制代码
      use App\Enums\ServerStatus;
      
      protected $casts = [
          'status' => ServerStatus::class,
      ];
    • 存储时,枚举的值(通常是字符串或整数)会被保存到数据库;读取时,会自动转换回对应的枚举实例。

  7. 测试辅助函数的改进

    • assertStatus 方法现在接受任何有效的 HTTP 状态码,而不仅仅是预定义的常量。

      php 复制代码
      $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,用于将文件内容流式传输到浏览器(例如下载大文件)。

      php 复制代码
      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 语句。

      blade 复制代码
      @use('App\Models\User')
      ...
      <p>Welcome, {{ User::find(Auth::id())->name }}!</p>
  13. boot 方法中的调度器访问

    • 现在可以在服务提供者的 boot 方法中直接访问调度器实例,方便注册计划任务:

      php 复制代码
      public function boot()
      {
          $this->app->booted(function () {
              $schedule = $this->app->make(Schedule::class);
              $schedule->command('some:command')->daily();
          });
      }
  14. when / unless 查询构造器方法

    • 新增了 whenunless 方法,提供更流畅的条件查询构建方式。

      php 复制代码
      $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 的官方升级指南和文档以获取完整列表和详细说明。

相关推荐
千里马学框架1 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台1 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone1 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc1 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo1 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077001 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼1 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone1 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen1 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone1 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui