我一直在使用laravel资源。默认情况下,laravel提供链接和元,如下所示。
"links": {
"first": "https://demo.test/api/v2/taxes?page=1",
"last": "https://demo.test/api/v2/taxes?page=4",
"prev": null,
"next": "https://demo.test/api/v2/taxes?page=2"
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 4,
"path": "https://demo.test/api/v2/taxes",
"per_page": 2,
"to": 2,
"total": 8
} 但我不想这样,我想要的是
"pagination": {
"total": 8,
"count": 8,
"per_page": 25,
"current_page": 1,
"total_pages": 1
}我可以得到这个信息,但如果我做了return TaxResource::collection($taxes);,我就不会得到这个。甚至我也有自定义的收集方法
public static function collection($resource)
{
$resource->pagination = [
'total' => $resource->total(),
'count' => $resource->count(),
'per_page' => $resource->perPage(),
'current_page' => $resource->currentPage(),
'total_pages' => $resource->lastPage()
];
return parent::collection($resource);
}这不是给我想要的。但是如果我通过(TaxResource::collection($taxes))->pagination;引用,我就能得到它。但是我想在做return TaxResource::collection($taxes);的时候把它还给你
发布于 2018-01-04 22:16:41
我对你的问题很感兴趣,花了一些时间解决这个问题。我想,为了改进雄辩的功能,今后还需要做很多工作: API Resources的功能。
为了解决这个问题,我必须使用资源集合而不是Resources
但是,如果需要自定义集合返回的元数据,则需要定义资源集合。
php artisan make:resource Tax --collection或
php artisan make:resource TaxCollection路由:
Route::get('/get-taxes', function () {
$taxes = Taxes::paginate();
return new TaxCollection($taxes);
});TaxCollection.php:
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\ResourceCollection;
class TaxCollection extends ResourceCollection
{
public function toArray($request)
{
return [
'data' => $this->collection,
'pagination' => [
'total' => $this->total(),
'count' => $this->count(),
'per_page' => $this->perPage(),
'current_page' => $this->currentPage(),
'total_pages' => $this->lastPage()
],
];
}
// Using Laravel < 5.6
public function withResponse($request, $response)
{
$originalContent = $response->getOriginalContent();
unset($originalContent['links'],$originalContent['meta']);
$response->setData($originalContent);
}
// Using Laravel >= 5.6
public function withResponse($request, $response)
{
$jsonResponse = json_decode($response->getContent(), true);
unset($jsonResponse['links'],$jsonResponse['meta']);
$response->setContent(json_encode($jsonResponse));
}
}这解决了这个问题,但现在有了新的问题:与Resources不同,我不知道如何在资源集合中修改toArray字段,手册只展示了'data' => $this->collection的示例,其中我们发送未修改的集合(Resources允许我们更改元数据)。因此,如果我们只使用资源,那么我们可以修改收集数据,而不是元数据。
发布于 2018-04-25 22:58:13
接受的答案对我没有用(在Laravel 5.6中),但我找到了一个更好的方法-- IMHO。
在ResourceCollection构造函数中保存分页信息,并使用基础集合替换分页器资源。
TaxCollection.php:
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\ResourceCollection;
class TaxCollection extends ResourceCollection
{
private $pagination;
public function __construct($resource)
{
$this->pagination = [
'total' => $resource->total(),
'count' => $resource->count(),
'per_page' => $resource->perPage(),
'current_page' => $resource->currentPage(),
'total_pages' => $resource->lastPage()
];
$resource = $resource->getCollection();
parent::__construct($resource);
}
public function toArray($request)
{
return [
'data' => $this->collection,
'pagination' => $this->pagination
];
}
}发布于 2019-03-21 14:49:23
因此,我发现在PHP中,您实际上可以在没有反射或其他解决方案的情况下调用祖父母函数。
考虑到TaxCollection扩展了ResoureCollection,而后者又扩展了JsonResource,我们实际上可以绕过处理分页的ResourceCollection方法。
class TaxCollection extends ResourceCollection
{
public function toArray($request)
{
return [
'data' => $this->collection,
'pagination' => [
'total' => $this->total(),
'count' => $this->count(),
'per_page' => $this->perPage(),
'current_page' => $this->currentPage(),
'total_pages' => $this->lastPage()
],
];
}
public function toResponse($request)
{
return JsonResource::toResponse($request);
}
}toResponse方法调用不是静态的,而是调用祖父母JsonResource::toResponse方法,就像父::toResponse将调用ResourceCollection toResponse(..)一样实例方法。
这将从JSON响应(链接、元等)中删除所有额外的分页字段,并允许您按照toArray($request)中的需要自定义响应。
https://stackoverflow.com/questions/48094741
复制相似问题