Skip to main content

Introducción

Esta guía cubre los pasos para migrar la estructura antigua de aplicación (con clases Kernel y varios service providers) de Laravel 10 y anteriores al Slim Application Skeleton de Laravel 11 en adelante.
La documentación oficial no recomienda esta migración.
  • La estructura antigua de Laravel 10 sigue funcionando en Laravel 11 y posteriores. No hay planes de retirar su soporte hasta la versión actual, incluida Laravel 13.
  • La migración es completamente opcional. Ni es obligatoria ni está recomendada.
  • Si no conoces en profundidad las diferencias entre la estructura antigua y la nueva, es muy recomendable no realizar la migración. Es un trabajo pensado para desarrolladores familiarizados con las tripas del framework.
  • Antes de migrar, haz siempre una copia de seguridad y comprueba que todos los tests pasan.

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:

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.
1

Sustituir bootstrap/app.php

El antiguo bootstrap/app.php creaba la instancia $app y registraba los kernels. Sustitúyelo por la cadena Application::configure().Antiguo (Laravel 10):
Nuevo (Laravel 11 y posteriores):
Las callbacks de 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.
2

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):
En Laravel 11 estos middlewares están integrados como valores por defecto dentro del framework. Si no los has personalizado, puedes eliminar 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.
Cuando hayas terminado la migración, elimina app/Http/Kernel.php.
En Laravel 11, las clases de middleware por defecto como 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.
3

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):
La carga automática de comandos en Laravel 11 y posteriores es automática: el directorio 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.
Tras la migración, elimina app/Console/Kernel.php.
No elimines los archivos de comandos Artisan personalizados de app/Console/. Deja los archivos de comandos tal cual y elimina únicamente el archivo de la clase Kernel.
4

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):
Si tienes personalizaciones, migra su contenido a withExceptions() en bootstrap/app.php antes de eliminarlo.
Si habías añadido elementos propios a $dontFlash, puedes migrarlos de la misma forma.
Cuando termine la migración, elimina app/Exceptions/Handler.php.
5

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):
Migra el registro de los archivos de rutas a withRouting() en bootstrap/app.php.
Migra los rate limits a AppServiceProvider::boot().
Si usas la constante 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.
6

Consolidar los service providers

Laravel 10 traía por defecto 5 service providers. Los consolidaremos en un único AppServiceProvider.php.Providers a eliminar (migra su contenido a AppServiceProvider antes de borrarlos):Ejemplo de migración del contenido antiguo de app/Providers/AuthServiceProvider.php:
Cuando hayas eliminado los archivos de providers innecesarios, elimina también el array providers de config/app.php.
Además, crea bootstrap/providers.php para adaptarte a la nueva estructura.
Si existe bootstrap/providers.php, Laravel dará prioridad a este archivo como lista de providers al cargarlos.
7

Actualizar la clase base de controlador

La clase base 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):
Nuevo (Laravel 11 y posteriores):
Sustituye las funcionalidades que aportaban los traits del siguiente modo.Si tus controladores existentes usan los métodos de esos traits, puedes elegir entre modificar cada controlador o dejar los traits en la clase base Controller. No es necesario cambiarlo todo a la vez para que funcione.
Si los controladores de autenticación generados por Breeze o Jetstream llaman a $this->validate() o $this->authorize(), comprueba siempre su funcionamiento antes de cambiar la clase base.
8

Eliminar archivos config innecesarios

Los archivos como 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.
9

Actualizar public/index.php

Ha cambiado para adaptarse a la nueva estructura, así que reescríbelo por completo.
10

Actualizar artisan

Reescribe también el archivo artisan por completo del mismo modo.
11

Actualizar tests/TestCase.php

El trait CreatesApplication ya no es necesario, así que ajústalo. Puedes borrar tests/CreatesApplication.php.
12

Actualizar .env, .env.example y phpunit.xml

Se ha renombrado 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.
13

Comprobación de funcionamiento

Cuando termine la migración, comprueba el funcionamiento en este orden.
Si aparecen problemas, restaura los archivos eliminados desde la copia de seguridad y revisa los mensajes de error.

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

Enlaces de referencia

Última modificación el 13 de julio de 2026