Laravel8.x API Resources处理API集合数据
hi,我是温新,一名PHPer
虽然使用resource
类可以对集合数据进行处理,但是更加推荐使用collection
对集合数据进行处理,各司其职,一目了然。更加更加方便于管理维护。
集合数据的处理
第一步:创建API Resources集合类
php artisan make:resource UserCollection
该命令会在app/Http/Resources
目录下生成对应的文件,如UserCollection.php
,文件内容如下:
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\ResourceCollection;
class UserCollection extends ResourceCollection
{
public function toArray($request)
{
return parent::toArray($request);
}
}
可以发现,继承的文件发生了变化,继承自ResourceCollection
。使用collection专门对集合资源进行处理。
第二步:修改UserCollection.php
// app/Http/Resources/UserCollection.php
public function toArray($request)
{
return [
'my_data' => $this->collection,
];
}
第三步:api数据数据处理
// routes/api.php
Route::get('/users', function (\App\Models\User $user) {
$users = \App\Models\User::all();
return new \App\Http\Resources\UserCollection($users);
});
由于 Laravel8.x API Resources返回单条自定义JSON数据 这篇文章已经定义了一个处理单条数据的资源,本篇文章又创建了一个UserCollection
,因此,在配合UserResource
一起时,直接返回了自定义的想要返回的字段。
第四步:访问路由,可以到已经是想要返回的数据了
{
"data": {
"my_data": [
{
"my_data": {
// 仅仅作为演示,减少文章长度,删除了数据
}
}
]
}
}
番外篇一:返回data数据
修改集合类
// app/Http/Resources/UserCollection.php
public function toArray($request)
{
return [
// 使用 data 进行覆盖即可
'data' => $this->collection,
];
}
番外篇二:API Resources的配合使用
由于上篇文章使用了UserResource
类,因此没有完全演示,现在创建一个UserDemoCollection.php
进行测试,这个文件就不在一步一步创建了。
// app/Http/Resources/UserDemoCollection.php
public function toArray($request)
{
return [
// data 返回集合数据
'data' => $this->collection,
'cus' => '我是自定义字段'
];
}
路由文件使用
// routes/api.php
Route::get('/users', function (\App\Models\User $user) {
$users = \App\Models\User::all();
return new \App\Http\Resources\UserDemoCollection($users);
});
此时通过路由文件来访问,就可以看到返回了所有了字段,这并不是想的,现在配合UserResource
类进行返回想要的字段,下面修改UserDemoCollection.php
// app/Http/Resources/UserDemoCollection.php
public function toArray($request)
{
return [
'data' => UserResource::collection($this->collection),
];
}
这样,就得到了想要数据了。
API分页处理
这个使用UserCollection.php
进行演示。
修改api.php
Route::get('/users', function (\App\Models\User $user) {
$users = \App\Models\User::paginate(1);
return new \App\Http\Resources\UserCollection($users);
});
只修改这一个地方,然后访问该地址,可以看到打出了非常多的东西,
{
"data": [
{
"my_data": {
"my_name": "lisi",
"my_email": "111@qq.com",
"my_php": "PHP是世界上最好语言",
"my_method": "通过模型方法返回"
}
}
],
"links": {省略},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 2,
"links": [省略],
"path": "http://la8study.io/api/users",
"per_page": 1,
"to": 1,
"total": 2
}
}
对于 links meta 等,可以进行覆盖或者自定义。
我是温新
每天进步一点点,就一点