如何解决每当我使用带有分页方法的 Laravel 资源时,我都会收到带有“链接”和“元”键的响应我想将这些键更改为新格式
我为我的 api 响应使用了 laravel 资源并添加了 paginate 方法。使用分页方法时,我总是得到这样的结果,其中 Laravel 默认提供三个键,即“数据”、“链接”和“元”。但我想根据自己的需要更改资源。
{
"data": [
{
"id": 1,"name": "Eladio Schroeder Sr.","email": "therese28@example.com",},{
"id": 2,"name": "Liliana Mayert","email": "evandervort@example.com",}
],"links":{
"first": "http://example.com/pagination?page=1","last": "http://example.com/pagination?page=1","prev": null,"next": null
},"Meta":{
"current_page": 1,"from": 1,"last_page": 1,"path": "http://example.com/pagination","per_page": 15,"to": 10,"total": 10
}
}
但我想要这样的结果
{
"data": [
{
"id": 1,"Metadata": {
"pagination": {
"offset": 50,"limit": 25,"prevIoUsOffset": 25,"nextOffset": 75,"currentPage": 3,"pageCount": 40,"totalCount": 1000
}
}
}
我怎样才能做到这一点。我正在使用 Laravel 7.*
我的控制器代码:
public function index(Request $request)
{
return discussionResource::collection($this->discussion->getdiscussionList($request));
}
我的模型方法如下所示:
public function getdiscussionList($request){
return $this->ofSearch($request)
->orderBy('created_at',config('settings.pagination.order_by'))
->paginate(config('settings.pagination.per_page'));
}
我的资源如下所示:
class discussionResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'id' => $this->id,'question_id' => $this->question_id,'user_id' => $this->user_id,'user_image' => $this->user->userProfile->image,'user_role' => $this->user->type,'comment' => $this->comment,'is_pinned' => $this->is_pinned,'created_at' => $this->created_at->toDateString()
];
}
}
解决方法
在 Laravel 中有很多方法可以做到这一点,这里有两种方法:
第一种方式:您可以创建自定义 PaginatedResourceResponse
并覆盖默认 paginationLinks
。例如如下:
use Illuminate\Http\Resources\Json\PaginatedResourceResponse;
class CustomPaginatedResourceResponse extends PaginatedResourceResponse
{
protected function paginationLinks($paginated)
{
return [
'prev' => $paginated['prev_page_url'] ?? null,'next' => $paginated['next_page_url'] ?? null,];
}
protected function meta($paginated)
{
$metaData = parent::meta($paginated);
return [
'current_page' => $metaData['current_page'] ?? null,'total_items' => $metaData['total'] ?? null,'per_page' => $metaData['per_page'] ?? null,'total_pages' => $metaData['total'] ?? null,];
}
}
然后覆盖 toResponse
方法(实际上是 toResponse
方法将资源集合转换为响应)
public function toResponse($request)
{
return $this->resource instanceof AbstractPaginator
? (new CustomPaginatedResourceResponse($this))->toResponse($request)
: parent::toResponse($request);
}
如果您想进一步自定义响应,您可以考虑覆盖其他方法。
第二种方式:您可以只覆盖 toResponse
中的 ResourceCollection
方法并按照您的意愿进行设置!
如果您想自定义元数据,您可以借助 Laravel 随附的 with()
方法进行集合。
// in DiscussionResource file
public function with($request)
{
return [
'meta' => [
'key' => 'value',],];
}
如果你想从控制器自定义它,你可以这样做
return (DiscussionResource::collection($this->discussion->getDiscussionList($request)))
->additional(['meta' => [
'key' => 'value',]]);
如果您希望它用于单个资源,您可以在 toArray()
方法中修改它
public function toArray($request)
{
return [
'data' => $this->collection,'links' => [
'self' => 'link-value',];
}
有关更多详细信息,您可以查看此https://laravel.com/docs/7.x/eloquent-resources#adding-meta-data
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。