Skip to main content

¿Qué es un controlador?

En lugar de definir toda la lógica de manejo de solicitudes como closures dentro de los archivos de rutas, puedes organizar ese comportamiento usando clases “controladoras”. Los controladores permiten agrupar la lógica de manejo de solicitudes relacionadas en una única clase. Por ejemplo, la clase UserController puede manejar todas las solicitudes entrantes sobre usuarios: mostrar, crear, actualizar y eliminar. Por defecto, los controladores se guardan en el directorio app/Http/Controllers.

Crear un controlador

Para crear un nuevo controlador rápidamente, usa el comando Artisan make:controller. Todos los controladores de la aplicación se guardan por defecto en el directorio app/Http/Controllers.

Controlador básico

Una clase controladora puede tener varios métodos públicos que respondan a las solicitudes HTTP entrantes.
Tras crear la clase y el método, puedes definir una ruta al método así:
Cuando una solicitud entrante coincide con el URI de la ruta, se llama al método show de la clase App\Http\Controllers\UserController y se le pasan los parámetros de la ruta.
No es necesario que el controlador extienda una clase base. Sin embargo, puede ser útil extender una clase base cuando tienes métodos que deben compartir todos los controladores.

Controladores de una sola acción

Si la acción de un controlador es especialmente compleja, puede ser útil dedicar toda la clase a esa única acción. Para ello, define un único método __invoke dentro del controlador.
Al registrar la ruta de un controlador de una sola acción no hace falta indicar el método. Basta con pasar el nombre del controlador al router.
Con la opción --invokable de make:controller puedes generar un controlador invocable.

Resource controllers

Si consideras cada modelo Eloquent de tu aplicación como un “recurso”, es habitual realizar el mismo conjunto de operaciones (CRUD) sobre cada uno. El enrutamiento de recursos de Laravel asigna las rutas típicas de creación/lectura/actualización/eliminación (CRUD) a un controlador con una sola línea de código. Con la opción --resource del comando make:controller puedes generar rápidamente un controlador que gestione esas acciones.
Este comando genera un controlador en app/Http/Controllers/PhotoController.php. El controlador incluye stubs para cada una de las operaciones de recurso disponibles. A continuación, registra la ruta de recurso que apunta al controlador.
Esta única declaración de ruta crea múltiples rutas para manejar las diversas acciones sobre el recurso. El controlador generado ya contiene stubs para cada una de esas acciones.
Ejecutando php artisan route:list puedes ver rápidamente el resumen de las rutas de la aplicación.

Rutas de recurso parciales

Al declarar rutas de recurso puedes indicar un subconjunto de acciones que el controlador debe manejar.

Rutas de recurso para API

Al declarar rutas de recurso para una API, es frecuente querer excluir rutas como create o edit, que muestran plantillas HTML. Con el método apiResource puedes excluir automáticamente esas dos rutas.

Inyección de dependencias

Inyección por constructor

El contenedor de servicios de Laravel se usa para resolver las dependencias de todos los controladores. Por eso puedes indicar mediante type-hint en el constructor las dependencias que necesita el controlador. Las dependencias declaradas se resuelven automáticamente y se inyectan en la instancia del controlador.

Inyección por método

Además de la inyección por constructor, también puedes tipar dependencias en los métodos del controlador. Un caso habitual es inyectar una instancia de Illuminate\Http\Request en el método del controlador.
Si el método del controlador también recibe entradas de parámetros de ruta, lista los argumentos de la ruta después de las otras dependencias. Por ejemplo, supongamos que se define la siguiente ruta:
Puedes definir el método del controlador así, para tipar Illuminate\Http\Request y acceder también al parámetro id:
Aprovechar la inyección de dependencias facilita sustituir por mocks en las pruebas y mejora la testabilidad del código.

Próximos pasos

Enrutamiento

Repasa cómo definir rutas y su relación con los controladores.
Última modificación el 13 de julio de 2026