Introducción
Laravel 11 se lanzó en marzo de 2024. Esta guía explica los pasos para actualizar de Laravel 10.x a 11.x.El tiempo estimado necesario para la actualización es de unos 15 minutos. Sin embargo, el impacto de los cambios disruptivos en tu aplicación varía según el tamaño y las funcionalidades utilizadas.
Actualización automatizada con Laravel Shift
Puedes automatizar la actualización con Laravel Shift. Shift actualiza automáticamente las dependencias y los archivos de configuración de tu aplicación.Cambios por nivel de impacto
Impacto: alto
- Actualización de dependencias
- Cambios en la estructura de la aplicación
- Cambios en los tipos de coma flotante
- Preservación de atributos al modificar columnas
- Versión mínima de SQLite
- Actualización de Sanctum
Impacto: medio
- Carbon 3
- Rehash de contraseñas
- Rate limiting en segundos
- Paquete Spatie Once
Impacto: bajo
- Eliminación de Doctrine DBAL
- Método
castsde los modelos Eloquent - Cambios en tipos espaciales
- Contract
Enumerable - Contract
UserProvider - Contract
Authenticatable
Pasos de actualización
Actualización de dependencias
Impacto: alto Actualiza las siguientes dependencias encomposer.json.
doctrine/dbal, ya puedes eliminarlo. En Laravel 11 desaparece la dependencia con ese paquete.
Requisitos de versión de PHP
Impacto: alto Laravel 11 requiere PHP 8.2.0 o superior. Además, el cliente HTTP de Laravel requiere curl 7.34.0 o superior.Cambios en la estructura de la aplicación
Impacto: alto En Laravel 11 se ha simplificado la estructura por defecto de la aplicación. Se ha reducido notablemente el número de service providers, middleware y archivos de configuración. Sin embargo, al actualizar una aplicación de Laravel 10 a Laravel 11 no se recomienda intentar migrar la estructura de la aplicación. Laravel 11 está diseñado para soportar también la estructura de aplicación de Laravel 10. Principales cambios estructurales:- Se ha cambiado para configurar middleware, exception handler y enrutamiento directamente en
bootstrap/app.php app/Http/Kernel.phpse ha eliminado y se ha integrado enbootstrap/app.php- Se ha reducido el número de service providers por defecto y se gestionan en
bootstrap/providers.php - Se ha reducido el número de archivos del directorio
config/(si es necesario, se pueden publicar conphp artisan config:publish)
Cambios disruptivos (Breaking Changes)
Autenticación
Rehash de contraseñas
Impacto: medio En Laravel 11, si el “work factor” del algoritmo de hash ha cambiado, en el momento de la autenticación se hace un rehash automático de la contraseña. Si el nombre del campo de contraseña del modeloUser no es password, indícalo con la propiedad authPasswordName del modelo.
config/hashing.php.
Contract UserProvider
Impacto: bajo
Se ha añadido el método rehashPasswordIfRequired al contract Illuminate\Contracts\Auth\UserProvider. Si tienes clases que implementan esta interfaz, añade el método.
Contract Authenticatable
Impacto: bajo
Se ha añadido el método getAuthPasswordName al contract Illuminate\Contracts\Auth\Authenticatable. Si tienes clases que implementan esta interfaz, añade el método.
Base de datos
Versión mínima de SQLite
Impacto: alto Si usas SQLite, se requiere SQLite 3.26.0 o superior. Por cierto, en los nuevos proyectos de Laravel 11, el driver de base de datos por defecto pasa a ser SQLite.Preservación de atributos al modificar columnas
Impacto: alto Al modificar una columna, debes indicar explícitamente todos los modificadores que quieras conservar tras la modificación. Los atributos no indicados se eliminan.Cambios en los tipos de coma flotante
Impacto: alto Se han unificado los tipos de columnadouble y float de migraciones entre todas las bases de datos.
unsignedDecimal, unsignedDouble y unsignedFloat se han eliminado. Si quieres seguir usando el atributo unsigned, indícalo encadenando el método.
Método casts de los modelos Eloquent
Impacto: bajo
Se ha definido el método casts en la clase base de modelo Eloquent. Si en los modelos de tu aplicación tienes definida una relación llamada casts, colisiona con el nombre y hay que renombrar.
Driver dedicado para MariaDB
Impacto: muy bajo En Laravel 11 se ha añadido un driver de base de datos dedicado a MariaDB. Al conectar con MariaDB puedes usar el drivermariadb en la configuración.
Cambios en tipos espaciales
Impacto: bajo Se han unificado los tipos de columna espaciales entre todas las bases de datos. En lugar de los métodospoint, lineString, polygon, etc., usa geometry o geography.
subtype y srid.
Eliminación de Doctrine DBAL
Impacto: bajo Laravel ha eliminado la dependencia de Doctrine DBAL. Se han eliminado las siguientes clases y métodos.Schema\Builder::useNativeSchemaOperationsIfPossible()Connection::getDoctrineConnection()Connection::getDoctrineSchemaManager()Connection::registerDoctrineType()DatabaseManager::registerDoctrineType()- Clase
Schema\Grammars\ChangeColumn - Clase
Schema\Grammars\RenameColumn
Schema::getTables(), Schema::getColumns(), Schema::getIndexes(), Schema::getForeignKeys(), etc.
Fechas
Carbon 3
Impacto: medio Laravel 11 soporta tanto Carbon 2 como Carbon 3. Si vas a actualizar a Carbon 3, ten en cuenta que los métodosdiffIn* pasan a devolver números de coma flotante y que los valores negativos representan la dirección temporal.
Rate limiting
Rate limiting en segundos
Impacto: medio En Laravel 11 se soporta rate limiting en segundos en lugar de en minutos. Los constructores de las clasesGlobalLimit y Limit reciben ahora los valores en segundos.
decayMinutes de la clase Limit se ha renombrado a decaySeconds y pasa a ser en segundos.
Los constructores de ThrottlesExceptions y ThrottlesExceptionsWithRedis también reciben ahora valores en segundos.
Paquetes
Publicación de service providers
Impacto: muy bajo Las nuevas aplicaciones de Laravel 11 no tienen el arrayproviders en config/app.php. Si un paquete publica un service provider, usa el método ServiceProvider::addProviderToBootstrapFile.
Sanctum
Actualización de Sanctum
Impacto: alto Laravel 11 no soporta Sanctum 3.x. Actualiza la dependencia de Sanctum encomposer.json a ^4.0.
Sanctum 4.0 ya no carga automáticamente las migraciones. Publícalas con el siguiente comando.
config/sanctum.php.
Paquete Spatie Once
Impacto: medio Laravel 11 ofrece ahora su propia funciónonce. Si usas el paquete spatie/once, elimínalo de composer.json para evitar conflictos.
Conclusión
Laravel 11 incluye grandes cambios estructurales, pero como la estructura de aplicación de Laravel 10 sigue funcionando tal cual, se puede migrar de forma gradual.| Cambio | Impacto | Acción |
|---|---|---|
Actualización de dependencias en composer.json | Alto | Cambiar a laravel/framework ^11.0 |
| PHP 8.2 obligatorio | Alto | Comprobar la versión de PHP |
| Preservación de atributos al modificar columnas | Alto | Revisar los usos de change() |
| Cambios en tipos de coma flotante | Alto | Revisar las definiciones de columnas double/float |
| SQLite 3.26.0+ obligatorio | Alto | Comprobar la versión de SQLite |
Sanctum ^4.0 | Alto | Publicar las migraciones |
| Carbon 3 | Medio | Comprobar los valores de retorno de los métodos diffIn* |
| Rate limiting en segundos | Medio | Cambiar decayMinutes por decaySeconds |
| Eliminación de Doctrine DBAL | Bajo | Migrar a los métodos nativos de schema |
Referencias
- Guía oficial de actualización (inglés)
- Diff del repositorio laravel/laravel (10.x → 11.x)
- Laravel Shift: servicio comunitario que automatiza la actualización
- Changelog de Carbon 3