Laravel8.x API Resources返回单条自定义JSON数据
hi,我是温新,一名PHPer
使用API时会有返回数据,那么在返回的数据中,对于那些不想要的字段,一般在模型中使用hidden
属性进行处理。Laravel ORM API提供了更加有好的方式,使得可以对数据进行更加有好的处理。
如:用户信息有username,age,sex
等字段,提供接口返回的数据只需要username
字段,更加友好的方式是使用API Resources
。API Resources 有两种处理方式,一种是处理单条数据,另一种是处理集合数据,本篇文章记录这两种方式。
Resource处理单条数据
第一步:创建Resources类
php artisan make:resource UserResource
该命令会在app/Http/Resources
目录下生成对应的文件,如UserResource.php
,文件内容如下:
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class UserResource extends JsonResource
{
/**
* 将资源转为数组
* 这里就是要返回给api接口的数据
*/
public function toArray($request)
{
return parent::toArray($request);
}
}
第二步:修改UserResource.php文件,返回想要的数据
// app/Http/Resources/UserResource.php
public function toArray($request)
{
// 自定义返回给接口的数据
return [
'name' => $this->name,
'email' => $this->email,
];
}
第三步:定义api
路由接口并使用资源类
Route::get('/users/{user}', function (\App\Models\User $user) {
return new \App\Http\Resources\UserResource($user);
});
第四步:浏览器访问,就可以看到接口只返回了name
和email
这两个字段。
番外一:自定义返回字段名
如 name
字段,返回时想要改成其他名称,也是可以 的,此处修改第二步
,
// app/Http/Resources/UserResource.php
public function toArray($request)
{
// 自定义返回字段名
return [
'my_name' => $this->name,
'my_email' => $this->email,
];
}
再到浏览器访问就可以看到字段名变成了自定义的了。
番外二:添加不存在的字段
有时间想要返回数据表中没有的字段,通过API资源类也是可以很友好的操作。再次修改第二步
// app/Http/Resources/UserResource.php
public function toArray($request)
{
return [
'my_name' => $this->name,
'my_email' => $this->email,
// 数据表不存在的字段
'my_php' => 'PHP是世界上最好语言',
'my_method'=> $this->getMethod(),
];
}
// app/Models/User.php
public function getMethod()
{
return '通过模型方法返回';
}
可以看到,通过不同的方式自定义了两个不存在的字段,并进行返回。
番外篇三,通过Api Resources返回集合数据
前面演示了是返回单条数据,通过Resource类可以返回集合数据,但是不推荐使用处理单条数据的Resource去处理集合类,不过还是进行一个演示。
下面修改api
路由文件,注意 UserResource.php 没有再修改。
// routes/api.php
Route::get('/users}', function (\App\Models\User $user) {
$users = \App\Models\User::all();
return \App\Http\Resources\UserResource::collection($users);
});
修改完成后就可以通过 路由 进行访问了。
无论是单条数据,还是集合数据,使用api resources接口返回时,都会使用data进行包裹一层。
我是温新
每天进步一点点,就一点