web-dev-qa-db-fra.com

Personnalisation Laravel 5.5 Pagination de la collection de ressources Api

Je travaille avec laravel api resource. Par défaut, laravel fournit des liens et des méta comme indiqué ci-dessous.

"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
} 

Mais je ne veux pas cela, insted je veux quelque chose comme

"pagination": {
  "total": 8,
  "count": 8,
  "per_page": 25,
  "current_page": 1,
  "total_pages": 1
}

Je peux obtenir cette information, mais si je fais return TaxResource::collection($taxes);, je ne l’aurai pas Même j'ai une méthode de collecte personnalisée 

 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);
    }

Ce n'est pas donner ce que je veux. Mais si je fais référence à (TaxResource::collection($taxes))->pagination;, je pourrai l'obtenir. Mais je veux que ce soit retourné quand je fais return TaxResource::collection($taxes);

4
vikas hemanth

La réponse acceptée ne fonctionnait pas pour moi (dans Laravel 5.6), mais j'ai trouvé un meilleur moyen, à mon humble avis.

Enregistrez les informations de pagination dans votre constructeur ResourceCollection et remplacez la ressource Paginator par la collection sous-jacente.

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
        ];
    }
}
6
cho

vous pouvez également étendre JsonResource, AnonymousResourceCollection, ResourceCollection et enfin PaginatedResourceResponse

1
Sébastien R

@ yrv16 Laravel version 5.6:

public function withResponse($request, $response)
{
    $jsonResponse = json_decode($response->getContent(), true);
    unset($jsonResponse['links'],$jsonResponse['meta']);
    $response->setContent(json_encode($jsonResponse));
}
0
Luciano Nascimento