Migrar a la estructura de Laravel 11: bootstrap/app.php, middleware y rutas sin Kernel
Hola, bienvenido. En esta lección empieza la tercera sección, la migración a la estructura nueva de Laravel 11, y vamos a sustituir app/Http/Kernel.php y app/Exceptions/Handler.php por bootstrap/app.php. En Laravel 11, las rutas, los middleware y las excepciones se configuran en bootstrap/app.php con withRouting(), withMiddleware() y withExceptions(), y los 9 middleware que el esqueleto de Laravel 10 copiaba en app/Http/Middleware pasan a vivir en el framework. Por eso un proyecto nuevo de Laravel 11 no tiene Kernel.php.
Antes de empezar, lo que dice la guía oficial, tal cual: "we do not recommend that Laravel 10 applications upgrading to Laravel 11 attempt to migrate their application structure, as Laravel 11 has been carefully tuned to also support the Laravel 10 application structure". Es decir, no recomienda migrar la estructura, y tiene razón en lo técnico: el proyecto funciona en Laravel 11 tal como lo dejamos en la lección anterior. Entonces, ¿por qué lo vamos a hacer? Porque toda la documentación de Laravel 11 en adelante habla de bootstrap/app.php, y en un proyecto con la estructura de Laravel 10 cada ejemplo hay que traducirlo: dónde se registra un alias de middleware, dónde se excluye una ruta del CSRF, dónde se programa una tarea. Quien se incorpore al equipo buscará bootstrap/app.php, y es también lo que hace Laravel Shift cuando actualiza un proyecto a Laravel 11. Si prefieres no hacerlo, el tag laravel-11-estructura-antigua es tu punto final, y no pasa nada.
Dónde estaba cada cosa en Laravel 10 y dónde está en Laravel 11
Esta tabla resume el cambio completo, lección a lección:
| En Laravel 10 | En Laravel 11 | Lección |
|---|---|---|
app/Http/Kernel.php: middleware globales, grupos web y api, alias |
withMiddleware() en bootstrap/app.php: el framework ya incluye los globales y los grupos, y solo se escribe lo que cambia |
11 |
Los 9 middleware de app/Http/Middleware |
Las clases del framework, que se configuran con métodos como validateCsrfTokens() |
11 |
app/Exceptions/Handler.php |
withExceptions() en bootstrap/app.php |
11 |
RouteServiceProvider carga routes/web.php y routes/api.php |
withRouting() en bootstrap/app.php |
11 |
public/index.php y artisan crean los Kernels a mano |
handleRequest() y handleCommand() |
11 |
Los providers del proyecto, en config/app.php |
bootstrap/providers.php |
12 |
app/Console/Kernel.php: la tarea programada |
routes/console.php, con la fachada Schedule |
13 |
El centro de todo es una llamada: Application::configure(). Nuestro bootstrap/app.php de Laravel 10 crea la aplicación con new Application y registra a mano los 2 Kernels y el Handler. El de Laravel 11 usa Application::configure(), que registra los Kernels y el Handler del framework y, además, sus propios providers de rutas y de eventos. Fíjate en lo que implica: en cuanto cambiemos bootstrap/app.php, nuestro Kernel HTTP, nuestro Handler y también nuestro Kernel de consola dejan de usarse, aunque sigan en el proyecto. Lo que hacían tiene que estar en bootstrap/app.php o en otro sitio que Laravel 11 lea, y por eso esta lección no termina al escribir el archivo nuevo: después vamos a comprobar qué ha dejado de funcionar y por qué.
Si quieres ver la estructura nueva desde cero, sin una migración de por medio, tienes el artículo Sumérgete en la estructura de directorios en Laravel 11 (se abre en una pestaña nueva).
- 02El bootstrap/app.php nuevo
- 03Los 9 middleware de app/Http/Middleware
- 04public/index.php y artisan
- 05El Kernel de consola, hasta la lección 13
- 06Los listeners de Registered, registrados 2 veces
- 07Los tests, sin Kernel HTTP