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();
更多信息
有关更多信息,请访问文档。