Saltar al contenido

Personalización de la paginación de Laravel 5.5 Api Resource Collection

Después de consultar con expertos en el tema, programadores de varias ramas y maestros dimos con la solución al problema y la plasmamos en esta publicación.

Solución:

Me interesó tu pregunta y dediqué algo de tiempo a resolverla. Supongo que hay mucho trabajo por hacer para mejorar Elocuente: Recursos API’ funcionalidad en el futuro.

Para resolverlo debo usar Colecciones de recursos en vez de Recursos:

Sin embargo, si necesita personalizar los metadatos devueltos con la colección, será necesario definir una colección de recursos

php artesanal hacer: impuesto de recursos –colección

o

php artesanal hacer:recurso TaxCollection

Ruta:

Route::get('/get-taxes', function () 
    $taxes = Taxes::paginate();
    return new TaxCollection($s);
);

RecaudaciónDeImpuestos.php:

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

Esto resuelve el problema, pero ahora hay uno nuevo: a diferencia Recursos no se como modificar toArray campos en Colecciones de recursosel manual muestra solo un ejemplo con 'data' => $this->collection donde enviamos colección no modificada (Colecciones de recursos nos permite cambiar los metadatos). Entonces, si usamos solo Recurso entonces podemos modificar los datos de la colección pero no los metadatos.

La respuesta aceptada no funcionó para mí (en Laravel 5.6), pero encontré una mejor manera en mi humilde opinión.

Guarde la información de paginación en su constructor ResourceCollection y reemplace el recurso Paginator con la Colección subyacente.

RecaudaciónDeImpuestos.php:

namespace AppHttpResources;

use IlluminateHttpResourcesJsonResourceCollection;

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
        ];
    

Así que descubrí que en PHP puedes llamar a una función de abuelo sin reflexión u otras soluciones.

Dado que TaxCollection extiende ResoureCollection, que a su vez extiende JsonResource, podemos omitir el método ResourceCollection que maneja la paginación.

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

la llamada al método toResponse NO es staticsino llamando al método abuelo JsonResource::toResponse, del mismo modo que parent::toResponse llamaría al método de instancia ResourceCollection toResponse(..).

Esto eliminará todos los campos de paginación adicionales de la respuesta JSON (enlaces, metadatos, etc.) y le permitirá personalizar la respuesta como desee en toArray($request)

Comentarios y puntuaciones del artículo

Recuerda difundir este escrito si te ayudó.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *