Controladores
Hasta ahora hemos puesto toda la lógica en las rutas, pero eso no escala. Los controladores te permiten organizar el código en clases dedicadas, siguiendo el patrón MVC.
¿Por qué usar controladores?
Imagina que tu archivo
routes/web.php tiene 50 rutas, cada
una con 20 líneas de lógica. Sería imposible de
mantener. Los controladores resuelven esto
agrupando la lógica relacionada en clases.
Crear un controlador
Usa Artisan para generar un controlador:
php artisan make:controller UserController
Esto crea
app/Http/Controllers/UserController.php:
<?php
declare(strict_types=1);
namespace App\Http\Controllers;
class UserController extends Controller
{
public function index(): string
{
return 'Lista de usuarios';
}
public function show(int $id): string
{
return "Usuario: $id";
}
}
Conectar ruta con controlador
En routes/web.php, apunta la ruta
al método del controlador:
use App\Http\Controllers\UserController;
Route::get('/usuarios', [UserController::class, 'index']);
Route::get('/usuarios/{id}', [UserController::class, 'show']);
La sintaxis es un array con la clase y el método como string.
Convenciones de nombres
Laravel usa estas convenciones para métodos de controlador:
-
index- Listar todos los recursos -
show- Mostrar un recurso específico -
create- Mostrar formulario de creación -
store- Guardar nuevo recurso -
edit- Mostrar formulario de edición -
update- Actualizar recurso existente destroy- Eliminar recurso
Controladores de un solo método
Si tu controlador solo tiene un método, usa
__invoke:
<?php
declare(strict_types=1);
namespace App\Http\Controllers;
class HomeController extends Controller
{
public function __invoke(): string
{
return 'Página de inicio';
}
}
En la ruta, no necesitas especificar el método:
Route::get('/', HomeController::class);
Usa controladores invocables para acciones únicas como la página de inicio, páginas estáticas o acciones que no encajan en un CRUD.
Parámetros en controladores
Los parámetros de la URL se inyectan automáticamente en los métodos:
// Ruta
Route::get('/posts/{id}/comments/{comment}', [PostController::class, 'showComment']);
// Controlador
public function showComment(int $id, int $comment): string
{
return "Post $id, Comentario $comment";
}
Ejercicios
Ejercicio 1: Controlador básico
Crea un ProductController con un
método index que devuelva "Lista de
productos" y conéctalo a la ruta
/productos.
Ver solución
// app/Http/Controllers/ProductController.php
<?php
declare(strict_types=1);
namespace App\Http\Controllers;
class ProductController extends Controller
{
public function index(): string
{
return 'Lista de productos';
}
}
// routes/web.php
use App\Http\Controllers\ProductController;
Route::get('/productos', [ProductController::class, 'index']);
Ejercicio 2: Controlador con parámetro
Añade un método show al
ProductController que reciba un
int $id y devuelva "Producto:
[id]". Conéctalo a /productos/{id}.
Ver solución
// En ProductController
public function show(int $id): string
{
return "Producto: $id";
}
// routes/web.php
Route::get('/productos/{id}', [ProductController::class, 'show']);
Ejercicio 3: Controlador invocable
Crea un AboutController invocable
que devuelva "Sobre nosotros" y conéctalo a
/sobre.
Ver solución
// app/Http/Controllers/AboutController.php
<?php
declare(strict_types=1);
namespace App\Http\Controllers;
class AboutController extends Controller
{
public function __invoke(): string
{
return 'Sobre nosotros';
}
}
// routes/web.php
use App\Http\Controllers\AboutController;
Route::get('/sobre', AboutController::class);
Resumen
En esta lección aprendiste:
- Los controladores organizan la lógica fuera de las rutas
-
php artisan make:controllergenera controladores -
La sintaxis
[Controller::class, 'method']conecta rutas -
__invokepara controladores de un solo método - Los parámetros de URL se inyectan automáticamente
En la siguiente lección aprenderás a trabajar con objetos Request y Response para manejar peticiones HTTP.
¿Has encontrado un error o tienes una sugerencia para mejorar esta lección?
Escríbenos¿Te está gustando el curso?
Tenemos cursos premium con proyectos reales, soporte personalizado y certificado.
Descubrir cursos premium