¿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 claseUserController 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 Artisanmake: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.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.
--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.
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.
| Método HTTP | URI | Acción | Nombre de ruta |
|---|---|---|---|
| GET | /photos | index | photos.index |
| GET | /photos/create | create | photos.create |
| POST | /photos | store | photos.store |
| GET | /photos/{photo} | show | photos.show |
| GET | /photos/{photo}/edit | edit | photos.edit |
| PUT/PATCH | /photos/{photo} | update | photos.update |
| DELETE | /photos/{photo} | destroy | photos.destroy |
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 comocreate 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 deIlluminate\Http\Request en el método del controlador.
Illuminate\Http\Request y acceder también al parámetro id:
Próximos pasos
Enrutamiento
Repasa cómo definir rutas y su relación con los controladores.