重新撸码

Hyperf resource 与 collection 合并

2020-09-28  本文已影响0人  大黄蜂阿天

laravel API 资源文档

基础设计和场景

基于以上的原因,做了一点扩展

一点点简单的改变

use Fangx\Resource\Json\JsonResource as OrgJsonResource;

class JsonResource extends OrgJsonResource
{
    protected $field = [];

    public function __construct($resource = NULL) {
        parent::__construct($resource);
    }

    public function withoutWrapping() {
        $this->wrap = NULL;
        return $this;
    }

    /**
     *
     * 兼容单行数据(model)和数据集(collection)
     *
     * @param $resource
     *
     * @return array
     */
    public function toApi($resource) {

        if ($resource instanceof \Traversable) {
            $res = [];
            foreach ($resource as $item) {
                $this->resource = $item;
                $res[]          = array_merge($this->toArray(), $this->fieldAppend());
            }
            return $res;
        } else {
            $this->resource = $resource;
            $res            = array_merge($this->toArray(), $this->fieldAppend());
            return $res;
        }
    }

    /**
     * 处理回调
     *
     * @return array
     */
    public function fieldAppend(): array {
        $res = [];
        if (!empty($this->field)) {
            foreach ($this->field as $index => $item) {
                $res[$index] = is_callable($item) ? $item($this->resource) : $item;
            }
        }
        return $res;
    }

resource编码实例

<?php

namespace App\Resource;


class TestResource extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @return array
     */
    public function toArray(): array {
        return [
            'id'   => 1,
            'name' => 'come'
        ];
    }

    public function withTest1() {
        $this->field['role1'] = [
            'id'   => 1,
            'name' => '主管'
        ];
        return $this;
    }


    public function withTest2() {
        //这个resource 就是模型里面传的 resource
        $this->field['role2'] = function ($resource) {
           return  [
                'id'       => 2,
                'name'     => '主任',
                'resrouce' => $resource
            ];
        };
        return $this;
    }
}

调用实例

return $this->succ((new TestResource())
                  ->withTest1()
                  ->withTest2()
                  ->toApi(['who' => '我是resource']));

结果

{
    "msg": "操作成功",
    "err": 0,
    "ext": {
        "id": 1,
        "name": "come",
        "role1": {
            "id": 1,
            "name": "主管"
        },
        "role2": {
            "id": 2,
            "name": "主任",
            "resrouce": {
                "who": "我是resource"
            }
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读