API Resource Laravel para JSON preciso

Clase 7 de 33Curso Avanzado de Laravel

Contenido del curso

Laravel y Base de Datos

    Resumen

    Con una API y autenticación listas, el siguiente paso es controlar qué expones en tu respuesta. Con la capa de transformación de Laravel, basada en API Resource, conviertes modelos de Eloquent en JSON preciso y seguro, mostrando solo los atributos necesarios y con nombres consistentes.

    ¿Cómo transformar respuestas JSON con api resource en Laravel?

    Los API Resource permiten dar forma a los datos antes de enviarlos al cliente. Así evitas exponer todos los atributos del modelo y puedes tipar valores para mantener consistencia.

    • Crea un recurso con la terminal.
    • Define el método to array con los campos permitidos.
    • Usa el recurso en el controlador para el método show.

    ¿Cómo crear un recurso con php artisan?

    Comando en la terminal:

    php artisan make resource ProductResource

    Estructura del recurso con tipado y claves en español:

    class ProductResource { public function toArray($request) { return [ 'id' => (int) $this->id, 'nombre' => (string) $this->name, 'precio' => (float) $this->price, ]; } }

    ¿Cómo usar el recurso en el controlador?

    • Para un solo modelo: instancia el recurso y pásale el modelo.
    • Respuesta: obtienes los datos transformados en JSON.
    // Ejemplo en ProductController@show return new ProductResource($product);
    • Ventaja: puedes cambiar etiquetas (por ejemplo, a español) sin afectar la lógica del modelo.

    ¿Cómo manejar colecciones y metadata con resource collection?

    Cuando trabajas con listas, como en el método index, necesitas transformar colecciones de productos. Tienes dos opciones: usar el método estático collection del recurso o crear una colección propia para personalizar la metadata.

    ¿Cómo usar collection directamente?

    • Transforma una colección sin crear otra clase.
    // En ProductController@index return ProductResource::collection($products);
    • Respuesta: obtienes un arreglo data con cada recurso transformado.

    ¿Cuándo crear un recurso tipo collection?

    • Cuando requieres metadata personalizada junto a los datos.
    php artisan make resource ProductCollection
    class ProductCollection extends ResourceCollection { public function toArray($request) { return [ 'data' => $this->collection, // 'meta' => [ ... ] // aquí puedes agregar metadata personalizada. ]; } public $collect = ProductResource::class; // aplica transformación a cada elemento. }

    Uso en el controlador:

    // En ProductController@index return new ProductCollection($products);
    • Si no indicas la propiedad pública collect, verás los modelos sin la transformación individual.
    • Con collect apuntando a ProductResource, cada elemento se transforma con el mismo recurso.

    ¿Qué pasa con los tests al envolver en data?

    • Al cambiar la estructura a un arreglo data, los tests pueden fallar.
    • Ajuste sugerido: en el método de prueba, contar elementos dentro de la clave data (por ejemplo, usando la aserción que cuente esa clave).

    ¿Cómo validar y autorizar con form request en endpoints?

    Para separar responsabilidades, mueve validaciones y autorizaciones a Form Request. Esto limpia el controlador y centraliza reglas.

    ¿Cómo crear e integrar form request?

    Comandos en la terminal:

    php artisan make request StoreProductRequest php artisan make request UpdateProductRequest

    Úsalos en el controlador en store y update.

    Reglas de validación mínimas:

    // En StoreProductRequest y UpdateProductRequest public function rules() { return [ 'nombre' => 'required', 'precio' => 'required', ]; }

    ¿Por qué aparece un 403 y cómo autorizar?

    • Si ves “la acción no está autorizada”, revisa authorize en el request.
    • Ventaja del Form Request: decidir quién puede ejecutar la petición.
    public function authorize() { return out()->check(); // permite a usuarios logueados. }
    • Tras autorizar y validar, los tests vuelven a pasar correctamente.

    ¿Tienes dudas sobre cómo aplicar estos API Resource y Form Request a tu entidad categoría o a otro modelo? Cuéntame tu caso en los comentarios y lo resolvemos juntos.

        API Resource Laravel para JSON preciso