laravel自定义分页数据格式

背景

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
"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容器内重新绑定了这个分页类的实现在这里插入图片描述
测试一下
在这里插入图片描述
完美解决

总结

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