Qué son los API resources
Cuando construyes una API y devuelves modelos Eloquent tal cual como JSON, puedes filtrar mal columnas que querías ocultar o enviar al cliente una gran cantidad de datos que no necesita. Los API resources de Eloquent son una capa de transformación entre los modelos y la respuesta JSON. Con el métodotoArray() puedes definir explícitamente qué se incluye en la respuesta y con qué formato.
Sus principales ventajas son:
- Control total sobre los campos que se incluyen en la respuesta.
- Un único lugar en el que renombrar campos y transformar valores.
- Posibilidad de incluir campos condicionalmente.
- Anidamiento de relaciones para mantener una estructura consistente.
Crear un resource
Genera una clase resource con el comando Artisanmake:resource.
app/Http/Resources.
$this, porque la clase resource actúa como proxy hacia el modelo subyacente.
Uso en un controlador
Puedes devolver el resource definido desde un controlador o una ruta.toResource() del modelo.
toResource() localiza automáticamente la clase resource correspondiente al modelo (UserResource).
Por defecto, la respuesta se envuelve en la clave data.
Colecciones de resources
Para devolver varios modelos utiliza el métodocollection().
toResourceCollection() sobre una colección Eloquent.
Resource collection personalizado
Si quieres añadir metadatos al conjunto de la colección, crea un resource collection propio.Transformar y renombrar campos
Puedes renombrar campos y transformar valores dentro detoArray().
Campos condicionales
when(): añadir un campo si se cumple una condición
Cuando solo quieras incluir un campo si se cumple una condición, utiliza when().
when() es false, la clave se elimina por completo de la respuesta.
mergeWhen(): añadir varios campos con la misma condición
Para incluir varios campos bajo la misma condición, utiliza mergeWhen().
whenLoaded(): incluir la relación solo si está cargada
Al incluir una relación solo cuando se haya cargado con eager loading, evitas el problema N+1 sin sacrificar la flexibilidad de la respuesta.
whenCounted(): incluir un conteo si se ha cargado
Incluye el conteo obtenido con loadCount() solo si está disponible.
Resources anidados
Puedes anidar relaciones a través de otra clase resource para mantener una estructura consistente.Añadir metadatos
with(): metadatos de nivel superior
Para añadir metadatos al conjunto de la colección, sobrescribe el método with().
additional(): metadatos dinámicos
Para añadir metadatos de forma dinámica desde el controlador utiliza additional().
Integración con la paginación
Basta con pasar el resultado paginado al resource para que se añadan automáticamentemeta y links.
En las respuestas paginadas la clave
data se conserva incluso aunque hayas llamado a withoutWrapping(), porque debe coexistir con las claves meta y links de la paginación.Desactivar el wrapping de datos
Por defecto el resource más externo se envuelve en la clavedata. Para desactivarlo, invoca withoutWrapping() en el método boot() de AppServiceProvider.
Ejemplo práctico: implementación de una API de usuarios
Diseño de respuestas coherentes con resources en una API de gestión de usuarios.UserResource
UserController
Páginas relacionadas
Introducción a las relaciones de Eloquent
Revisa cómo definir relaciones y aplicar eager loading.
Paginación
Consulta cómo combinar los resultados paginados con los API resources.