Laravel 7.x 十大新特性解析

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

1. Laravel Airlock (Sanctum)

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

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

  • 在路由模型绑定中,除了默认使用 id 字段外,现在可以自定义解析模型时使用的字段 (例如 usernameslug)。

  • 示例:在 RouteServiceProviderboot 方法中定义:

    php 复制代码
    public function boot()
    {
        parent::boot();
        Route::model('user', User::class, function ($value) {
            return User::where('username', $value)->firstOrFail();
        });
    }

3. HTTP 客户端

  • 引入了基于 Guzzle HTTP 客户端的流畅接口,用于发起 HTTP 请求。

  • 语法简洁,支持链式调用,内置常用功能(如 JSON 解码、抛出异常)。

  • 示例:

    php 复制代码
    $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 类型转换:

    php 复制代码
    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);
                }
            };
        }
    }

    在模型中使用:

    php 复制代码
    protected $casts = [
        'options' => Json::class,
    ];

5. 路由 URL 生成器增强

  • URL::signedRouteURL::temporarySignedRoute 方法现在支持指定过期时间作为第二个参数(之前是第三个参数),使签名更简洁。

  • 示例:

    php 复制代码
    $url = URL::temporarySignedRoute(
        'unsubscribe', now()->addMinutes(30), ['user' => 1]
    );

6. Blade 组件标签 & 优化

  • 组件别名 :可以在单个文件中定义 Blade 组件,并通过 @component 指令的别名来引用,简化了使用。

    php 复制代码
    // resources/views/components/alert.blade.php
    <div class="alert">
        {{ $slot }}
    </div>

    AppServiceProvider 注册别名:

    php 复制代码
    public function boot()
    {
        Blade::component('components.alert', 'alert');
    }

    在视图使用:

    php 复制代码
    @alert(['type' => 'danger'])
        You are not allowed to access this resource!
    @endalert
  • 组件标签 :引入了更简洁的标签语法 <x-component-name> (Laravel 7.x 开始引入,后续版本继续完善)。

    php 复制代码
    <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 构建能力和代码组织方式。

相关推荐
ccddsdsdfsdf1 天前
DBeaver怎么链接mongoDB
数据库·mongodb
丷丩1 天前
Postgresql基础实践教程(十一)各种Join
数据库·postgresql·join
星夜夏空991 天前
FreeRTOS学习(4)——内存映射
数据库·学习·mongodb
TheRouter1 天前
AI Agent 记忆体系建设实战:短期、长期与工作记忆的工程实现
数据库·人工智能·oracle
Omics Pro1 天前
首个!外源天然产物综合性代谢图谱
数据库·人工智能·算法·机器学习·r语言
JAVA面经实录9171 天前
Hibernate面试题库
数据库·oracle·hibernate
迷枫7121 天前
DM8 目录结构与常用排查入口梳理
服务器·数据库
Mr.Daozhi1 天前
RAG 进阶实战:跑通 Demo 后我连续翻了 6 次车,逐一修复才真正可用(含 Gradio Web 版)
前端·数据库·langchain·大模型·gradio·rag·科研工具
小程故事多_801 天前
Claude Code自定义workflow skills用法
数据库·人工智能·智能体
大鹏说大话1 天前
SQL 排序与分组实战:解决“分组后取最新数据“
android·java·数据库