微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

每当我使用带有分页方法的 Laravel 资源时,我都会收到带有“链接”和“元”键的响应我想将这些键更改为新格式

如何解决每当我使用带有分页方法的 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 方法并按照您的意愿进行设置!

More Ways HERE!

,

如果您想自定义元数据,您可以借助 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?