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

相关推荐
木子予彤2 小时前
Android 性能诊断 V2:基于 Agent Skill 的原生 IDE 融合架构
android·ai编程
木子予彤2 小时前
基于 Perfetto 与 AI 的 Android 性能自动化诊断方案
android·ai编程
代龙涛2 小时前
WordPress 首页模板怎么写(index.php 与 front-page.php)
android·php·android studio
羊羊20352 小时前
开发手札:Unity6000与Android交互
android·unity·android-studio
Kapaseker3 小时前
如果你还没有搞懂 Kotlin 委托属性,进来看看
android·kotlin
黄林晴3 小时前
苦等多年!Compose 终于迎来原生 Media3 播放器
android
亘元有量-流量变现3 小时前
深度技术对比:Android、iOS、鸿蒙(HarmonyOS)权限管理全解析
android·ios·harmonyos·方糖试玩
米码收割机3 小时前
【Android】基于安卓app的健身房会员管理系统(源码+部署方式+论文)[独一无二]
android
酿情师3 小时前
2026软件系统安全赛初赛RSA(赛后复盘)
android·网络·安全·密码学·rsa