首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >定制Laravel 5.5 Api资源收集分页

定制Laravel 5.5 Api资源收集分页
EN

Stack Overflow用户
提问于 2018-01-04 11:55:39
回答 6查看 33.1K关注 0票数 21

我一直在使用laravel资源。默认情况下,laravel提供链接和元,如下所示。

代码语言:javascript
运行
复制
"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
} 

但我不想这样,我想要的是

代码语言:javascript
运行
复制
"pagination": {
  "total": 8,
  "count": 8,
  "per_page": 25,
  "current_page": 1,
  "total_pages": 1
}

我可以得到这个信息,但如果我做了return TaxResource::collection($taxes);,我就不会得到这个。甚至我也有自定义的收集方法

代码语言:javascript
运行
复制
 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);的时候把它还给你

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2018-01-04 22:16:41

我对你的问题很感兴趣,花了一些时间解决这个问题。我想,为了改进雄辩的功能,今后还需要做很多工作: API Resources的功能。

为了解决这个问题,我必须使用资源集合而不是Resources

但是,如果需要自定义集合返回的元数据,则需要定义资源集合。

代码语言:javascript
运行
复制
php artisan make:resource Tax --collection

代码语言:javascript
运行
复制
php artisan make:resource TaxCollection

路由:

代码语言:javascript
运行
复制
Route::get('/get-taxes', function () {
    $taxes = Taxes::paginate();
    return new TaxCollection($taxes);
});

TaxCollection.php:

代码语言:javascript
运行
复制
<?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允许我们更改元数据)。因此,如果我们只使用资源,那么我们可以修改收集数据,而不是元数据。

票数 32
EN

Stack Overflow用户

发布于 2018-04-25 22:58:13

接受的答案对我没有用(在Laravel 5.6中),但我找到了一个更好的方法-- IMHO。

在ResourceCollection构造函数中保存分页信息,并使用基础集合替换分页器资源。

TaxCollection.php:

代码语言:javascript
运行
复制
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
        ];
    }
}
票数 12
EN

Stack Overflow用户

发布于 2019-03-21 14:49:23

因此,我发现在PHP中,您实际上可以在没有反射或其他解决方案的情况下调用祖父母函数。

考虑到TaxCollection扩展了ResoureCollection,而后者又扩展了JsonResource,我们实际上可以绕过处理分页的ResourceCollection方法。

代码语言:javascript
运行
复制
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)中的需要自定义响应。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48094741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档