API Resource Laravel para JSON preciso

Clase 7 de 33Curso Avanzado de Laravel

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.