Introducción
Laravel 10 se lanzó el 14 de febrero de 2023. Esta guía explica los pasos para actualizar de Laravel 9.x a 10.x.El tiempo estimado necesario para la actualización es de unos 10 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
- Actualización de minimum-stability
Impacto: medio
- Cambios en las expresiones de base de datos
- Eliminación de la propiedad
$datesde los modelos - Monolog 3
- Tags de caché en Redis
- Cambios en el mocking de servicios
- Directorio de idiomas
Impacto: bajo
- Mensajes de reglas de validación con closures
- Método
afteren form requests - Binding de la ruta pública
- Constructor de
QueryException - Valor de retorno del rate limiter
- Eliminación del método
Redirect::home - Eliminación del método
Bus::dispatchNow - Método
registerPolicies - Columna ULID
Pasos de actualización
Actualización de dependencias
Impacto: alto Actualiza las siguientes dependencias encomposer.json.
Actualización de minimum-stability
Impacto: alto Actualizaminimum-stability en composer.json a stable. Como el valor por defecto es stable, también puedes eliminar esta línea.
Requisitos de versión de PHP
Impacto: alto Laravel 10 requiere PHP 8.1.0 o superior y Composer 2.2.0 o superior.Cambios disruptivos (Breaking Changes)
Aplicación
Binding de la ruta pública
Impacto: bajo Si personalizabas la ruta pública haciendo binding depath.public en el contenedor, cámbialo para usar el método usePublicPath de Illuminate\Foundation\Application.
Autorización
Método registerPolicies
Impacto: bajo
El método registerPolicies del AuthServiceProvider lo llama ahora el framework automáticamente. Puedes eliminar la llamada a este método en boot.
Caché
Tags de caché en Redis
Impacto: medioCache::tags() solo se recomienda para aplicaciones que usan Memcached. Si usas Redis como driver de caché, considera migrar a Memcached.
Base de datos
Cambios en las expresiones de base de datos
Impacto: medio Las expresiones de base de datos generadas conDB::raw se han reescrito. Para obtener el valor bruto de cadena de la expresión hay que usar el método getValue(Grammar $grammar). Ya no se puede usar el cast a (string).
Constructor de QueryException
Impacto: muy bajo
Se ha añadido un primer argumento con el nombre de conexión (string) al constructor de Illuminate\Database\QueryException. Si lanzas esta excepción manualmente, corrige el código.
Columna ULID
Impacto: bajo Si en una migración llamas al métodoulid sin argumentos, el nombre de la columna es ulid. En releases anteriores, al llamarlo sin argumentos se creaba por error una columna con nombre uuid.
Eloquent
Propiedad $dates de los modelos
Impacto: medio
Se ha eliminado la propiedad obsoleta $dates de los modelos Eloquent. Usa la propiedad $casts.
Localización
Directorio de idiomas
Impacto: ninguno No afecta a las aplicaciones existentes, pero el esqueleto de las nuevas aplicaciones Laravel ya no incluye el directoriolang por defecto. Si lo necesitas, puedes publicarlo con un comando Artisan.
Log
Monolog 3
Impacto: medio La dependencia Monolog de Laravel se ha actualizado a Monolog 3.x. Si usas Monolog directamente en la aplicación, consulta la guía de actualización de Monolog. Si usas servicios de logging de terceros como BugSnag o Rollbar, puede que necesites actualizar a versiones que soporten Monolog 3.x y Laravel 10.x.Cola
Eliminación del método Bus::dispatchNow
Impacto: bajo
Se han eliminado los métodos obsoletos Bus::dispatchNow y dispatch_now. Usa Bus::dispatchSync y dispatch_sync.
Enrutamiento
Alias de middleware
Impacto: opcional En las nuevas aplicaciones Laravel, la propiedad$routeMiddleware de la clase App\Http\Kernel se ha renombrado a $middlewareAliases. Aplicarlo a aplicaciones existentes es opcional.
Valor de retorno del rate limiter
Impacto: bajo Al llamar al métodoRateLimiter::attempt, ahora se devuelve tal cual el valor de retorno del closure suministrado. Si no devuelves nada o devuelves null, se devuelve true.
Eliminación del método Redirect::home
Impacto: muy bajo
Se ha eliminado el método obsoleto Redirect::home. Cambia a redirección explícita a una ruta con nombre.
Testing
Mocking de servicios
Impacto: medio Se ha eliminado del framework el trait obsoletoMocksApplicationServices. Este trait proporcionaba métodos de test como expectsEvents, expectsJobs, expectsNotifications, etc.
Si usas estos métodos, migra a Event::fake, Bus::fake y Notification::fake respectivamente.
Validación
Mensajes de reglas de validación con closures
Impacto: muy bajo En reglas de validación personalizadas basadas en closure, si llamas varias veces al callback$fail, los mensajes se añaden a un array en lugar de sobrescribirse.
Además, el callback $fail devuelve ahora un objeto. Si tenías type hint sobre el valor de retorno del closure de validación, actualízalo.
Método after en form requests
Impacto: muy bajo
El método after dentro de form requests está reservado por Laravel. Si tienes definido un método after en un form request, renómbralo o modifícalo para aprovechar la nueva funcionalidad “post-validación”.
Conclusión
Laravel 10 está compuesto por cambios relativamente pequeños y la actualización se puede completar en poco tiempo.| Cambio | Impacto | Acción |
|---|---|---|
Actualización de dependencias en composer.json | Alto | Cambiar a laravel/framework ^10.0 |
| PHP 8.1 / Composer 2.2 obligatorios | Alto | Comprobar y actualizar versiones |
| Cambios en expresiones de base de datos | Medio | Cambiar el cast a (string) por getValue() |
Eliminación de la propiedad $dates de los modelos | Medio | Migrar a $casts |
| Monolog 3 | Medio | Si lo usas directamente, revisar la guía de actualización |
| Tags de caché en Redis | Medio | Considerar la migración a Memcached |
Eliminación de MocksApplicationServices | Medio | Migrar a Event::fake, etc. |
Eliminación de Bus::dispatchNow | Bajo | Cambiar a Bus::dispatchSync |
| Nombre de columna ULID | Bajo | Revisar las llamadas a ulid() en migraciones |
Eliminación de Redirect::home | Muy bajo | Cambiar a Redirect::route('home') |
Referencias
- Guía oficial de actualización (inglés)
- Diff del repositorio laravel/laravel (9.x → 10.x)
- Laravel Shift: servicio comunitario que automatiza la actualización
- Guía de actualización de Sanctum (2.x → 3.x)
- Guía de actualización de Monolog 3.x