Laravel8.x API Resources返回单条自定义JSON数据

作者: 温新

分类: 【Laravel】

阅读: 2824

时间: 2021-12-17 14:39:21

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);
});

第四步:浏览器访问,就可以看到接口只返回了nameemail这两个字段。

番外一:自定义返回字段名

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进行包裹一层。

我是温新

每天进步一点点,就一点

请登录后再评论