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

相关推荐
_李小白9 小时前
【android opencv学习笔记】Day 2: Mat类(图片数据结构体)
android·opencv·学习
jinanwuhuaguo10 小时前
OpenClaw工程解剖——RAG、向量织构与“记忆宫殿”的索引拓扑学(第十三篇)
android·开发语言·人工智能·kotlin·拓扑学·openclaw
小怪吴吴12 小时前
idea 开发Android
android·java·intellij-idea
xiaoyan201513 小时前
2026爆肝!Flutter3.41纯手撸微信聊天APP原生应用
android·flutter·dart
jinanwuhuaguo14 小时前
OpenClaw协议霸权——从 MCP 标准到意图封建化的政治经济学(第十八篇)
android·人工智能·kotlin·拓扑学·openclaw
撩得Android一次心动14 小时前
Android Room 数据库详解【源码篇】
android·数据库·android jetpack·room
TO_ZRG15 小时前
Android WorkManager 完全入门指南
android
a8a30216 小时前
Laravel 6.x新特性全解析
android
用户游民16 小时前
Android 腾讯X5WebView如何禁止系统自带剪切板和自定义剪切板视图
android·java
Lyyaoo.16 小时前
TreadLocal和TreadLocalMap
android·java·redis