Introducción
Esta guía cubre los pasos para migrar la estructura antigua de aplicación (con clasesKernel y varios service providers) de Laravel 10 y anteriores al Slim Application Skeleton de Laravel 11 en adelante.
Cuándo puede ser necesario migrar
Puedes plantearte la migración en casos como los siguientes:- Quieres que la estructura del proyecto coincida con la estándar más reciente para que los nuevos miembros del equipo puedan contrastarla fácilmente con la documentación oficial.
- Quieres mantener la coherencia con paquetes o starter kits creados en Laravel 11 o posterior.
- Quieres reducir los archivos y clases de configuración heredados de la estructura antigua y simplificar tu código base.
Requisitos previos
Esta guía asume lo siguiente:- La actualización de versión de Laravel ya se ha completado (
laravel/framework ^11.0o superior). - Todos los tests existentes pasan.
- Conoces la estructura de aplicación de Laravel 11 en adelante (consulta Estructura de aplicación en Laravel 11 y posteriores).
Ejemplo de migración
A continuación se muestran los pasos para migrar únicamente la estructura de la aplicación de un proyecto creado con Laravel 10 + Breeze (stack Blade), manteniendo Breeze intacto.Sustituir bootstrap/app.php
bootstrap/app.php creaba la instancia $app y registraba los kernels. Sustitúyelo por la cadena Application::configure().Antiguo (Laravel 10):withMiddleware() y withExceptions() son el sitio donde deberás migrar la configuración de los archivos de kernel que eliminarás en el siguiente paso. De momento déjalas vacías; añadirás la configuración en pasos posteriores.Eliminar el kernel HTTP (app/Http/Kernel.php)
app/Http/Kernel.php definía los middlewares globales, los grupos de middleware y los alias de middleware.Antiguo (app/Http/Kernel.php):app/Http/Kernel.php directamente.Si tienes personalizaciones (añades o excluyes middlewares propios), migra esa configuración a withMiddleware() en bootstrap/app.php antes de eliminarlo.app/Http/Kernel.php.TrustProxies, EncryptCookies o VerifyCsrfToken también se pueden eliminar de app/Http/Middleware/. Como el framework las incorpora internamente, si no necesitas personalizarlas, sus archivos ya no hacen falta.Eliminar el kernel de consola (app/Console/Kernel.php)
app/Console/Kernel.php se encargaba de definir el schedule y de cargar automáticamente los comandos.Antiguo (app/Console/Kernel.php):app/Console/Commands/ se escanea solo, por lo que no necesitas $this->load().La definición del schedule se migra a routes/console.php o al withSchedule() de bootstrap/app.php.app/Console/Kernel.php.app/Console/. Deja los archivos de comandos tal cual y elimina únicamente el archivo de la clase Kernel.Eliminar el handler de excepciones (app/Exceptions/Handler.php)
app/Exceptions/Handler.php se encargaba de la configuración del reporte y del renderizado de excepciones.Antiguo (app/Exceptions/Handler.php):withExceptions() en bootstrap/app.php antes de eliminarlo.$dontFlash, puedes migrarlos de la misma forma.app/Exceptions/Handler.php.Eliminar RouteServiceProvider y migrar el registro de rutas
app/Providers/RouteServiceProvider.php cargaba los archivos de rutas y definía los rate limits.Antiguo (app/Providers/RouteServiceProvider.php):withRouting() en bootstrap/app.php.AppServiceProvider::boot().HOME en algún sitio, reemplázala por la URL directamente en forma de cadena o mueve la constante a AppServiceProvider.Cuando termines la migración, elimina app/Providers/RouteServiceProvider.php.Consolidar los service providers
AppServiceProvider.php.Providers a eliminar (migra su contenido a AppServiceProvider antes de borrarlos):| Archivo | Destino de la migración |
|---|---|
app/Providers/AuthServiceProvider.php | Gate::policy(), etc., en AppServiceProvider::boot() |
app/Providers/BroadcastServiceProvider.php | Si usas broadcasting, withBroadcasting() de bootstrap/app.php |
app/Providers/EventServiceProvider.php | Event::listen(), etc., en AppServiceProvider::boot() |
app/Providers/RouteServiceProvider.php | Ya tratado en el paso anterior |
providers de config/app.php.bootstrap/providers.php para adaptarte a la nueva estructura.bootstrap/providers.php, Laravel dará prioridad a este archivo como lista de providers al cargarlos.Actualizar la clase base de controlador
Controller de Laravel 10 usaba los traits AuthorizesRequests y ValidatesRequests. La nueva clase base de Laravel 11 es una clase abstracta simple sin esos traits.Antiguo (Laravel 10):| Método antiguo (vía trait) | Método nuevo |
|---|---|
$this->validate($request, $rules) | $request->validate($rules) |
$this->authorize('update', $post) | Gate::authorize('update', $post) |
$this->authorizeResource(Post::class) | En Laravel 11 no hay una alternativa sencilla, así que deja App\Http\Controllers\Controller con las especificaciones de Laravel 10 |
Controller. No es necesario cambiarlo todo a la vez para que funcione.Eliminar archivos config innecesarios
config/cors.php, config/hashing.php o config/view.php que no hayas modificado respecto al valor por defecto se pueden eliminar. Mantén los que hayas cambiado.Actualizar public/index.php
Actualizar tests/TestCase.php
CreatesApplication ya no es necesario, así que ajústalo. Puedes borrar tests/CreatesApplication.php.Actualizar .env, .env.example y phpunit.xml
CACHE_DRIVER a CACHE_STORE y se han añadido algunas entradas, así que ajústalos si es necesario.
Estos cambios pueden afectar a los archivos de config y al entorno de producción, así que hazlos con cuidado.
No es imprescindible seguir todos los cambios al pie de la letra.Estructura de archivos tras la migración
Tras migrar, el proyecto tendrá una estructura similar a esta (se indican las diferencias frente a la estructura antigua).Resumen
| Elemento migrado | Ubicación antigua | Ubicación nueva |
|---|---|---|
| Middleware HTTP | app/Http/Kernel.php | withMiddleware() en bootstrap/app.php |
| Manejo de excepciones | app/Exceptions/Handler.php | withExceptions() en bootstrap/app.php |
| Definición del schedule | app/Console/Kernel.php | routes/console.php |
| Registro de rutas | app/Providers/RouteServiceProvider.php | withRouting() en bootstrap/app.php |
| Lista de service providers | Array providers en config/app.php | bootstrap/providers.php |
| Registro de policies | app/Providers/AuthServiceProvider.php | Registro automático. Registro manual en AppServiceProvider::boot() |
| Event listeners | app/Providers/EventServiceProvider.php | Registro automático. Registro manual en AppServiceProvider::boot() |