oscabrera/laravel-json-api-format-paginate

此包允许您使用JSON:API格式分页资源

v1.0.3 2024-06-21 00:08 UTC

This package is auto-updated.

Last update: 2024-09-06 10:20:58 UTC


README

Latest Version on Packagist Total Downloads built with Codeium

laravel-json-api-format-paginate

请参考laravel-json-api-format-paginate的文档。

此包提供三个类,用于以JSON:API格式响应资源集合。它简化了将Eloquent模型和分页结果转换为符合JSON规范的响应。

安装

通过Composer安装包

composer require oscabrera/laravel-json-api-format-paginate

在模型中

在模型中,重要是使用属性$fillable$hidden

$hidden中,您必须将模型中的id添加进去。

protected $hidden = [
        'id',
    ];

$fillable中,您应该添加所有希望由模型返回的属性。

用法

EntityResourceTransformer

EntityResourceTransformer将单个资源转换为JSON:API格式。

<?php

namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\Request;
use Oscabrera\JsonApiFormatPaginate\Utilities\JsonApiPaginationTransformer;

class UserController extends Controller
{
    public function read(string $id)
    {
        $user = User::query()->where('id', $id)->first();

        return new EntityResourceTransformer($user);
    }
}

示例结果:

{
  "data": {
    "id": 2,
    "type": "User",
    "attributes": {
      "name": "userOne",
      "email": "userOne@example.com"
    }
  },
  "links": {
    "self": "https:///users/2"
  }
}

JsonApiResourceTransformer

JsonApiResourceTransformer将单个资源转换为JSON:API格式。

<?php

namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\Request;
use Oscabrera\JsonApiFormatPaginate\Utilities\JsonApiPaginationTransformer;
use Spatie\QueryBuilder\QueryBuilder;
use Spatie\JsonApiPaginate\JsonApiPaginate;

class UserController extends Controller
{
    public function index()
    {
        $fields = $user->getFields();
        $users = QueryBuilder::for(User::class)
            ->allowedFilters($fields)
            ->allowedSorts($fields)
            ->jsonPaginate();

        return new JsonApiPaginationTransformer($users);
    }
}

示例结果:

{
  "data": [
    {
      "id": 2,
      "type": "User",
      "attributes": {
        "id": 2,
        "name": "1",
        "email": "1",
        "email_verified_at": "2024-05-18 14:53:42",
        "password": "1",
        "remember_token": "1",
        "created_at": "2024-05-18T14:53:42.000000Z",
        "updated_at": "2024-05-18T14:53:42.000000Z"
      }
    }
  ],
  "links": {
    "self": "https:///users?page%5Bsize%5D=1&filter%5Bname%5D=1&page%5Bnumber%5D=1",
    "first": "https:///users?page%5Bsize%5D=1&filter%5Bname%5D=1&page%5Bnumber%5D=1",
    "last": "https:///users?page%5Bsize%5D=1&filter%5Bname%5D=1&page%5Bnumber%5D=1",
    "prev": null,
    "next": null
  },
  "meta": {
    "current_page": 1,
    "from": 1,
    "last_page": 1,
    "path": "https:///users",
    "per_page": 1,
    "to": 1,
    "total": 1
  }
}

与Spatie包集成

为了过滤和排序JSON:API响应,建议使用以下Spatie包

使用QueryBuilder

为了方便使用QueryBuilder,添加了getFields方法,该方法从$fillable和$hidden变量中获取模型列,并合并这些数据。这使得可以使用如allowedFilters、allowedSorts等方法。

示例:

$fields = $user->getFields();
$users = QueryBuilder::for(User::class)
    ->allowedFilters($fields)
    ->allowedSorts($fields)
    ->jsonPaginate();

更多信息

有关更多信息,请访问文档