hamidmp/dualresource

DualResource - 请求和响应的参数映射器

v1.0.1 2021-12-30 11:38 UTC

This package is not auto-updated.

Last update: 2024-09-20 01:26:47 UTC


README

DualResource 是 Laravel Resource 的一个派生类。Laravel Resource
通过 DualResource,除了 API Resource 可以做到的,你还可以使用相同的模板将请求数据映射到数组。

  • 映射请求数据到新数组
  • 将模型映射到 json

安装

通过 Composer 需要

composer require hamidmp/dualresource

用法

class Person {
    // firstName, lastName, city, ...
    
    public function cars(){
        return $this->hasMany(Car::class);
    }
}

class Car {
    // person_id, name, model, ...   
}

1. 在客户端(API 或 UI)中使用 fnamelname 代替 firstNamelastName

class PersonDualResource extends DualResource  {

    protected function mapFields()
    {
        return [
            'fname'=>'fisrtName',
            'lname'=>'lastName',
        ];
    }

}
$data = PersonDualResource::fromRequest($request)->getParameters();
//$request contained: fname, lname
//$data will contain: firstName , lastName 

注意:方法 mapFields 将生成 toArray 方法,你不需要更改它。

2. 关联使用

class PersonDualResource extends DualResource  {

    protected function mapFields()
    {
        return [
            'fname'=>'fisrtName',
            'lname'=>'lastName',
            'car_list'=>['cars',CarDualResource::class],
        ];
    }

}
$data = PersonDualResource::fromRequest($request)->getParameters();
//$request contained: fname, lname, car_list:[ {name, model},... ]
//$data will contain: firstName , lastName, cars=>[ [name,model],... ] 

3. 使用匿名函数进行映射

class PersonDualResource extends DualResource  {

    protected function mapFields()
    {
        return [
            'fname'=>'fisrtName',
            'lname'=>'lastName',

            'car_list'=>['cars',function($key){
                //for response
                return CarDualResource::collection($this->{$key});

            },function($data){
                //for request
                return CarDualResource::fromRequestData($data);

            }],
        ];
    }

}

注意:你可以通过返回 null 值来忽略每个函数:return null;

4. 作为正常的资源类使用(用于响应)

$person=\App\Models\Person::with('cars')->find(1);
return \App\Http\Resources\PersonDualResource::fromModel($person)->response();

方法

  • 准备类
//Declaring assign-map between model and data
//return array 
protected function mapFields()
  • 从请求数据
//Preparing DualResource for mapping data from request
public static function fromRequest(Request $request)

//return array of mapped request data
public function getParameters($extra=[], $defaults=[])

//return array of mapped request data plus other ones
public function getAll($extra=[], $defaults=[])
  • 准备为响应(json)
//return a new resource instance from one model
public static function fromModel(...$parameters)

//return a new anonymous resource collection from Models
public static function fromModels($resource)

许可证

DualSource 库是开源软件,许可协议为 MIT 许可协议