背景
用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
容器内重新绑定了这个分页类的实现
测试一下
完美解决
总结
主要还是用到了类的重写和容器, 没啥特别复杂的操作