oscabrera / laravel-json-api-format-paginate
此包允许您使用JSON:API格式分页资源
v1.0.3
2024-06-21 00:08 UTC
Requires
- php: ^8.1
- laravel/framework: ^9.0|^10.0|^11.0
- spatie/laravel-json-api-paginate: ^1.14
- spatie/laravel-query-builder: ^6.0
This package is auto-updated.
Last update: 2024-09-06 10:20:58 UTC
README
请参考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包
-
spatie/laravel-json-api-paginate:用于分页JSON响应。文档:spatie/laravel-json-api-paginate
-
spatie/laravel-query-builder:用于构建和执行查询。文档:spatie/laravel-query-builder
使用QueryBuilder
为了方便使用QueryBuilder,添加了getFields方法,该方法从$fillable和$hidden变量中获取模型列,并合并这些数据。这使得可以使用如allowedFilters、allowedSorts等方法。
示例:
$fields = $user->getFields(); $users = QueryBuilder::for(User::class) ->allowedFilters($fields) ->allowedSorts($fields) ->jsonPaginate();
更多信息
有关更多信息,请访问文档。