好的,Laravel 7.x 版本引入了一些重要的新特性和改进,以下是其主要特性概述:

1. Laravel Airlock (Sanctum)

  • 轻量级 API 认证系统:专为 SPA (单页应用)、移动应用和简单的基于令牌的 API 设计。
  • 令牌管理:用户可以为账户生成多个 API 令牌,每个令牌可以分配特定的权限/作用域。
  • 会话认证:利用内置的 Cookie 认证会话,为 SPA 提供认证支持。

2. 自定义模型绑定键名 (Route::model 绑定增强)

  • 在路由模型绑定中,除了默认使用 id 字段外,现在可以自定义解析模型时使用的字段(例如 usernameslug)。
  • 示例:在 RouteServiceProviderboot 方法中定义:
    public function boot()
    {
        parent::boot();
        Route::model('user', User::class, function ($value) {
            return User::where('username', $value)->firstOrFail();
        });
    }
    

3. HTTP 客户端

  • 引入了基于 Guzzle HTTP 客户端的流畅接口,用于发起 HTTP 请求。
  • 语法简洁,支持链式调用,内置常用功能(如 JSON 解码、抛出异常)。
  • 示例:
    $response = Http::withHeaders([
        'X-First' => 'foo',
        'X-Second' => 'bar'
    ])->post('https://example.com/users', [
        'name' => 'Taylor',
    ]);
    if ($response->successful()) {
        // ...
    }
    

4. Castable 接口 (自定义 Eloquent 类型转换)

  • 允许开发者创建自定义的 Eloquent 类型转换类
  • 实现 Castable 接口的类必须定义一个 castUsing 方法,该方法返回一个实现了 CastsAttributes 接口的类。
  • 示例:定义自定义的 Json 类型转换:
    use Illuminate\Contracts\Database\Eloquent\Castable;
    use Illuminate\Contracts\Database\Eloquent\CastsAttributes;
    
    class Json implements Castable
    {
        public static function castUsing(array $arguments)
        {
            return new class implements CastsAttributes {
                public function get($model, $key, $value, $attributes)
                {
                    return json_decode($value, true);
                }
                public function set($model, $key, $value, $attributes)
                {
                    return json_encode($value);
                }
            };
        }
    }
    

    在模型中使用:
    protected $casts = [
        'options' => Json::class,
    ];
    

5. 路由 URL 生成器增强

  • URL::signedRouteURL::temporarySignedRoute 方法现在支持指定过期时间作为第二个参数(之前是第三个参数),使签名更简洁。
  • 示例:
    $url = URL::temporarySignedRoute(
        'unsubscribe', now()->addMinutes(30), ['user' => 1]
    );
    

6. Blade 组件标签 & 优化

  • 组件别名:可以在单个文件中定义 Blade 组件,并通过 @component 指令的别名来引用,简化了使用。
    // resources/views/components/alert.blade.php
    <div class="alert">
        {{ $slot }}
    </div>
    

    AppServiceProvider 注册别名:
    public function boot()
    {
        Blade::component('components.alert', 'alert');
    }
    

    在视图使用:
    @alert(['type' => 'danger'])
        You are not allowed to access this resource!
    @endalert
    

  • 组件标签:引入了更简洁的标签语法 <x-component-name> (Laravel 7.x 开始引入,后续版本继续完善)。
    <x-alert type="danger" message="You are not allowed to access this resource!"/>
    

7. 路由 CORS 配置

  • 新增了 HandleCors 中间件,允许在 config/cors.php 文件中集中配置跨域资源共享 (CORS) 策略,取代了之前需要手动添加 cors 中间件的方式。

8. 测试改进

  • 队列 Fake:新增 Queue::fake() 方法,允许在测试中模拟队列任务,断言任务是否被派发而不实际执行它们。
  • Mail FakeMail::fake() 现在可以用于模拟邮件发送,断言邮件是否应发送给特定收件人。
  • HTTP 测试:增强了 HTTP 测试方法,如 assertJsonPath, assertExactJson, assertJsonMissing, assertJsonStructure 等,提供更细致的 JSON 响应断言。

9. Artisan 命令改进

  • artisan test 命令:新增了更简洁的命令来运行 PHPUnit 测试。
  • artisan make:factory:可以单独创建工厂文件(之前 make:model -f 会同时创建模型、迁移和工厂)。

10. 其它优化

  • stub 文件放置位置变更:从 resources 目录移到 stubs 目录。
  • markdown 邮件模板位置变更:从 resources/views/vendor/mail 移到 resources/views/vendor/mail/htmlresources/views/vendor/mail/text
  • Eloquent 优化:firstOrCreateupdateOrCreate 等方法现在支持使用闭包定义额外属性。
  • Paginator 默认使用Tailwind CSS 分页视图。
  • Symfony 组件依赖升级到 Symfony 5.x。

这些特性提升了 Laravel 的开发体验、测试便利性、API 构建能力和代码组织方式。

Logo

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

更多推荐