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

相关推荐
DogDaoDao5 小时前
Android 硬件编码器参数完全指南:MediaCodec 深度解析
android·音视频·视频编解码·h264·硬编码·视频直播·mediacodec
JohnnyDeng946 小时前
Android 自定义 View:Canvas 绘图与事件分发深度解析
android
Android小码家9 小时前
Framework之Launcher小窗开发
android·framework·虚拟屏·小窗
赏金术士9 小时前
第七章:状态管理实战与架构总结
android·ui·kotlin·compose
颂love11 小时前
MySQL的执行流程
android·数据库·mysql
云起SAAS15 小时前
抖音小游戏源码 - 消消乐 | 含激励广告+成就系统 | 开箱即用商业级消除游戏模板
android·游戏·广告联盟·看激励广告联盟流量主·抖音小游戏源码 - 消消乐
大貔貅喝啤酒16 小时前
基于Windows下载安装Android Studio 3.3.2版本教程(2026详细图文版)
android·java·windows·android studio
程序员码歌16 小时前
OpenSpec 到 Superpowers:AI 编码从说清到做对
android·前端·人工智能
2501_9151063217 小时前
深入解析无源码iOS加固原理与方案,保护应用安全
android·安全·ios·小程序·uni-app·cocoa·iphone
黄林晴20 小时前
重磅官宣:Android UI 开发正式进入 Compose-first 时代
android·google io