API 资源和 API 资源集合的辅助修改

前几日询问了关于api资源的一些鸡肋的询问,貌似并未得到有价值的结果。以下是链接:
问答:大家有没有觉得 API 资源和 API 资源集合是鸡肋一样的存在

本来算放弃,只用最原始的函数封装的办法来做呢,但是每每想到这里,心里总是有个梗。于是,经过昨晚的认真分析。写出来下面两个关于资源的类的方法。一个是api资源,一个是api资源类。
实现的主要功能
1、api资源和api资源集合的元数据返回值的封装
2、api资源和api资源集合的输出的数据筛选
筛选提供两种方式,选择和排除。
此举仅仅是抛砖引玉之作,还有大家积极贡献自己的好办法。

api资源

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class CourseResource extends JsonResource
{
    // 定义符合的字段的输出列表
    protected $only = ['id', 'title', 'price'];
    // 定义需要排除的字段列表
    protected $except = ['deleted_at', 'created_at', 'updated_at'];

    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return resource_data($this->selectField($this->resource, 'only'));
    }
    /*
     * 处理字段的筛选符合的内容
     * 如果是数组需要对字段帅选的话 可以这么用
     */
    private function selectField($data, $type){
        // 选择合适结果集
        $field = $this->$type;
        // 使用字段筛选出符合的字段
        return collect($data)->$type($field);
    }
}

api资源集合

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\ResourceCollection;

class CourseCollection extends ResourceCollection
{
    // 定义符合的字段的输出列表
    protected $only = ['id', 'title', 'price'];
    // 定义需要排除的字段列表
    protected $except = ['deleted_at', 'created_at', 'updated_at'];
    /**
     * Transform the resource collection into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        // 对返回值记性帅选处理
        return resource_data($this->selectField($this->collection, 'except'));
    }
    /*
     * 处理字段的筛选符合的内容
     * 如果是数组需要对字段帅选的话 可以这么用
     */
    private function selectField($data, $type){
        // 对数组进行循环的处理
        $field = $this->$type;
        return $data->map(function($item) use($type, $field){
            return collect($item)->$type($field);
        });
    }
}

api返回方法封装

/*
 * 设置固定的返回值的格式
 * $data  为返回的数据
 * $code  为返回的状态码
 * $msg   为返回的信息
 * $jsonp 是否设置为跨域访问
 */
function resource_data($data=[], $code=200, $msg='success'){
    return [
        'code' => $code,
        'msg' => $msg,
        'data' => $data
    ];
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 5

去掉resource_data会好点,在外面封装一个格式化返回的类

5年前 评论

@ab0029 这样也是可以的,格式更鲜明。

5年前 评论

resource_data 方法中的参数传不进去

4年前 评论

@没有风筝的线 你要先定义resource_data这个函数。然后再加载这个函数的文件即可。
我一般在这个函数定义在app/helpers.php中。然后修改composer.json文件,autoload模块下新增下列代码

        "files":[
            "app/helpers.php"
        ]

新增完成的autoload是这个样子的

"autoload": {
        "psr-4": {
            "App\\": "app/"
        },
        "classmap": [
            "database/seeds",
            "database/factories"
        ],
        "files":[
            "app/helpers.php"
        ]
    },

最后,再执行 composer dump-auto 这个命令,然后,函数就可以正常使用了

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!