Respuestas

1. Generalizar respuestas de la API

2. Transformaciones por seguridad y compatibilidad

Permiten transformar respuestas que retorna la API RESTful, cambiar nombre de atributos, tipos de datos, etc...

Son muy útiles, por ejemplo, si en algún momento cambia el nombre de un atributo en la DB , se le puede aplicar una transformación a la respuesta para que el resultado final obtenido por el cliente sea el mismo

En PHP las transformaciones se pueden realizar con un paquete llamado Fractal, sin embargo su uso es complejo, por tanto haremos uso de un paquete de laravel que facilita el uso de Fractal.

Info adicional

http://fractal.thephpleague.com/

  • Descargar paquete de fractal para laravel

composer require spatie/laravel-fractal
  • Registrar el service provider en config/app.php

/*
* Package Service Providers...
*/
...
Spatie\Fractal\FractalServiceProvider::class,

Si escribimos en la consola php artisan veremos que existe un nuevo comando make:transformer, este utilizaremos para crear los transformadores para cada modelo.

  • Crear transformadores para cada modelo

Los transformadores se guardan en la carpeta app/Transformers

  • Personalizar transformadores para cada modelo

  • Relacionar cada modelo con su transformación

Para esto añadir el atributo $transformer en cada modelo, por ejemplo en Product

  • Retornar respuestas transformadas

Utilizar métodos de transformación en trait ApiResponser para retornar valores en showOne y showAll

Nota: al retornar los datos transformados no es necesario especificar la raíz data, ['data' => $collection], porque fractal lo añade automáticamente.

3. Validaciones y Transformaciones

El transformador del modelo Category tiene la estructura

Al hacer un post, se presentan 2 problemas:

  • Problema 1

Al enviar los datos en el formulario con los valores de la transformación, estos no son considerados válidos

  • Crear e implementar middleware para solucionar problema

Para solucionar el problema interceptar las peticiones recibidas, usando un middleware. Este solo se aplicará a peticiones POST PUT PATCH

Registrar en app/Http/Kernel.php

Personalizar middleware

Al crear una nueva categoría, se considera válido el campo title

Usar middleware en controladores con store y update, especificando que será necesario solo en esos métodos y enviándole como parámetro la estructura del transformador del modelo involucrado

  • Problema 2

Los nombres de campos retornados por la validaciones no coinciden con los establecidos en los transformadores. Como se refleja anteriormente, se tienen name y description que son los valores originales del modelo y no title o details que se especificaron con el transformador.

  • Solucionar problema

Al obtener los errores de validación es necesario, para cada campo original del modelo, obtener su valor transformado mostrárselo al usuario.

Así, se debe crear en cada transformación un método (transformedAttribute) que retorne el correspondiente valor transformado para un atributo del modelo:

Añadir nuevas validaciones al middleware

4. Ordenar y filtrar según parámetros de la URL

Estos mecanismos de filtrado y ordenamiento se deben aplicar sobre los datos sin transformar, porque operan sobre colecciones y no sobre instancias de fractal (retornadas por la transformación)

  • Ordenar resultados usando cualquier atributo

https://elbauldelprogramador.com/buenas-practicas-para-el-diseno-de-una-api-restful-pragmatica/#ordenación

Problema:

No existe hasta ahora una manera de saber cuál atributo del modelo corresponde a cada atributo transformado, para esto es necesario crear un método estático (no es necesario instanciar la clase para acceder a él) que realice un mapeado dentro de la transformación

Dentro del ApiResponser, en sortData utilizar el método originalAttributes para obtener a cuál valor del modelo corresponde el valor recibido como parámetro en la url

  • Filtrar resultados según múltiples parámetros

  • Paginar resultados

La paginación permite dividir los resultados en segmentos, es especialmente importante cuando se tiene un número grande de datos.

Eloquent cuenta con el método paginate, que opera sobre colecciones de la base de datos y retorna los resultados en segmentos (páginas), sin embargo esta solución no es completamente adecuada para nuestro caso, teniendo cuenta que no funciona para colecciones a las que se les apliquen las operaciones pluck, unique, etc...

En caso de ordenar los resultados,

Permitir tamaño de página personalizado

Last updated

Was this helpful?