Laravel8.x API Resources处理API集合数据

作者: 温新

分类: 【Laravel】

阅读: 3094

时间: 2021-12-17 15:28:53

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 等,可以进行覆盖或者自定义。

我是温新

每天进步一点点,就一点

请登录后再评论