laravel自定义分页数据格式

728 阅读1分钟
原文链接: blog.kakuya.club

背景

laravel好几年了, 这次写接口的时候, 突然发现分页数据返回的格式有点杂,而且作为一个api不需要返回这么多用不着的数据, 于是就想着看看能不能改下

{
    "code": 200,
    "data": {
        "current_page": 1,
        "data": [
            {
                "id": 1,
                "name": "技术部",
                "description": "",
                "qr_code_path": "http://mag.com/1.jpg",
                "created_at": "2020-06-24 16:12:43",
                "updated_at": "2020-06-24 16:12:44"
            }
        ],
        "first_page_url": "http://mag.com/department?page=1",
        "from": 1,
        "last_page": 1,
        "last_page_url": "http://mag.com/department?page=1",
        "next_page_url": null,
        "path": "http://mag.com/department",
        "per_page": 10,
        "prev_page_url": null,
        "to": 1,
        "total": 1
    },
    "message": "success"
}

解决

寻找发现
Illuminate\Database\Eloquent\Builder 文件
在这里插入图片描述
调用组装分页数据的地方

随即再跟进Illuminate\Database\Concerns\BuildsQueries

在这里插入图片描述
可以看到我用 红色标出来是是返回的分页类, 用 蓝色标出来是用容器加载的这个类

继续查找这个类Illuminate\Pagination\LengthAwarePaginator
发现组装分页数据的是这个类中toArray方法
在这里插入图片描述
刚刚上面也说这个分页类是通过容器加载的,那我们只要在容器内重新加载下这个类就行

于是我先自定义了一个分页类,继承了上面的分页类,并重写了toArray方法
在这里插入图片描述
然后在AppServiceProvider容器内重新绑定了这个分页类的实现在这里插入图片描述
测试一下
在这里插入图片描述
完美解决

总结

主要还是用到了类的重写和容器, 没啥特别复杂的操作