homesheer/laravel-assembler

Laravel 的 Eloquent 模型或 DTO 组装器

V2.0.4 2020-03-03 08:04 UTC

This package is auto-updated.

Last update: 2024-09-29 05:20:51 UTC


README

中文说明

For Laravel 5 For Lumen 5 Latest Version on Packagist Total Downloads Software License

介绍

Laravel Assembler 用于检索前端请求中 Eloquent 模型或 DTO 的指定字段,以减少 API 接口升级的需求。

要求

此包需要 Laravel 5.4 或更高版本。

安装

您可以通过 Composer 安装此包

composer require homesheer/laravel-assembler

您可以使用以下命令发布配置文件

php artisan vendor:publish --provider="HomeSheer\LaravelAssembler\AssemblerServiceProvider" --tag="config"

对于 Laravel 5.4 或更早版本

// config/app.php
HomeSheer\LaravelAssembler\AssemblerServiceProvider::class,

对于 Lumen

// bootstrap/app.php
$app->register(HomeSheer\LaravelAssembler\AssemblerServiceProvider::class);

使用方法

1. 实例化 Assembler 或从 Assembler 继承的子类,并传入 Eloquent 模型或 DTO

$assembler = new Assembler(User::find($id));

2. 调用 AssemblergetAssembledData 方法以获取组装数据

$assembledUserData = $assembler->getAssembledData();

3. 将查询字符串 fields 添加到 URL 中并指定要获取的字段

请求的控制器方法返回上一步的 $assembledUserData

return $this->response($assembledUserData);

请求 API 接口,在 fields 查询字符串中指定字段

// Get name and gender field information for users with ID 1
https:///users/1?fields={name,gender}

4. 可以获取不存在于 Eloquent ModelDTO 中的属性

简单地创建一个新的类,继承自 Assembler 并定义获取虚拟属性的方法

class UserAssembler extends Assembler
{
    public function getVirtualField()
    {
        return 'VirtualField';
    }
}

然后将虚拟字段添加到请求中

https:///users/1?fields={name,gender,virtualField}

5. 支持三种类型的数据源:具有 getter 方法的对象、没有 getter 方法但有 public 属性的对象和关联数组

具有 getter 方法的对象

class User
{
    public function getName()
    {
        return 'Mars';
    }
}

没有 getter 方法但有 public 属性的对象

class User
{
    public $name = 'Mars';
}

关联数组

$user = [
    'name' => 'Mars',
];

6. 优先级

获取的字段按照以下顺序从高到低检索,直到字段终止,默认返回 null 如果未检索到。

  • 自定义 Assembler 中的 getter 方法
  • Eloquent ModelDTO 中的 getter 方法
  • Eloquent ModelDTO 中的属性

7. 嵌套级联

Eloquent Model 的情况下,自然支持获取关联模型属性,以及返回对象或数组的自定义 getter 方法或属性。

// Address is the associated object of user model
https:///users/1?fields={name,gender,address{province,city}}

DTO 的情况下,您需要定义自己的 getter 方法或属性,该属性返回对象或数组。

如果是关联数组,它就是一个多维关联数组。

为了响应速度,不建议嵌套超过五层。

8. 配置

如果自定义 Assemblerconfig/assembler.php 中的 maps 配置了相应的关联,则当在实例化父类 Assembler 后调用 getAssembler 方法时,将自动获取 getAssembledData 的相应 getter 方法。

贡献

欢迎贡献,感谢大家 :)

许可证

Laravel Assembler 是开源软件,采用 MIT 许可证