Skip to main content

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étodo toArray() 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 Artisan make:resource.
La clase generada se ubica en el directorio app/Http/Resources.
Puedes acceder directamente a las propiedades del modelo con $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.
También puedes usar el método 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étodo collection().
O bien 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 de toArray().

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().
Si la condición de 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.
Puedes decidir en el controlador si cargar o no la relación.

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().
Ejemplo de respuesta:

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áticamente meta y links.
O bien:
Ejemplo de respuesta:
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 clave data. Para desactivarlo, invoca withoutWrapping() en el método boot() de AppServiceProvider.
withoutWrapping() afecta únicamente al wrapping más externo. Las claves data que tú mismo hayas definido no se eliminan.

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.
Última modificación el 13 de julio de 2026