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ó.