1. Introducción
  2. Guía de Actualización

Cambios de Alto Impacto

Cambios de Impacto Medio

Cambios de Bajo Impacto

Actualización a la Versión 10.0 desde la 9.x

Tiempo Estimado de Actualización: 10 Minutos

Nota Intentamos documentar cada posible cambio que podría causar problemas. Dado que algunos de estos cambios rompedores se encuentran en partes más oscuras del framework, es posible que solo una parte de estos cambios afecte realmente a tu aplicación. ¿Quieres ahorrar tiempo? Puedes utilizar Laravel Shift para ayudar a automatizar las actualizaciones de tu aplicación.

Actualización de Dependencias

Probabilidad de Impacto: Alta

Se Requiere PHP 8.1.0

Laravel ahora requiere PHP 8.1.0 o superior.

Se Requiere Composer 2.2.0

Laravel ahora requiere Composer 2.2.0 o superior.

Dependencias de Composer

Deberías actualizar las siguientes dependencias en el archivo composer.json de tu aplicación:

  • laravel/framework to ^10.0
  • laravel/sanctum to ^3.2
  • doctrine/dbal to ^3.0
  • spatie/laravel-ignition to ^2.0
  • laravel/passport to ^11.0 (Upgrade Guide)

Si estás actualizando a Sanctum 3.x desde la serie de versiones 2.x, consulta la guía de actualización de Sanctum.

Además, si deseas utilizar PHPUnit 10, deberías eliminar el atributo processUncoveredFiles de la sección <coverage> del archivo de configuración phpunit.xml de tu aplicación. Luego, actualiza las siguientes dependencias en el archivo composer.json de tu aplicación:

  • nunomaduro/collision to ^7.0
  • phpunit/phpunit to ^10.0

Finalmente, examina cualquier otro paquete de terceros consumido por tu aplicación y verifica que estás utilizando la versión adecuada para el soporte de Laravel 10.

Estabilidad Mínima

Deberías actualizar el ajuste minimum-stability en el archivo composer.json de tu aplicación a stable. O, dado que el valor predeterminado de minimum-stability es stable, puedes eliminar esta configuración del archivo composer.json de tu aplicación:

"minimum-stability": "stable",

Aplicación

Enlace de Ruta Pública

Probabilidad de Impacto: Baja

Si tu aplicación personaliza su "ruta pública" vinculando path.public en el contenedor, deberías actualizar tu código para invocar el método usePublicPath ofrecido por el objeto Illuminate\Foundation\Application:

app()->usePublicPath(__DIR__.'/public');

Autorización

El Método registerPolicies

Probabilidad de Impacto: Baja

El método registerPolicies de AuthServiceProvider ahora se invoca automáticamente por el framework. Por lo tanto, puedes quitar la llamada a este método del método boot de AuthServiceProvider de tu aplicación.

Caché

Etiquetas de Caché de Redis

Probabilidad de Impacto: Media

El soporte para etiquetas de caché de Redis ha sido reescrito para mejorar el rendimiento y la eficiencia de almacenamiento. En versiones anteriores de Laravel, las etiquetas de caché obsoletas se acumulaban en la caché cuando se usaba Redis como el controlador de caché de tu aplicación.

Sin embargo, para podar adecuadamente las entradas obsoletas de las etiquetas de caché, el nuevo comando Artisan cache:prune-stale-tags de Laravel debe ser programado en la clase App\Console\Kernel de tu aplicación:

$schedule->command('cache:prune-stale-tags')->hourly();

Base de Datos

Expresiones de Base de Datos

Probabilidad de Impacto: Media

Las "expresiones" de base de datos (normalmente generadas mediante DB::raw) se han reescrito en Laravel 10.x para ofrecer funcionalidades adicionales en el futuro. Especialmente, el valor de cadena sin procesar de la gramática ahora debe recuperarse mediante el método getValue(Grammar $grammar) de la expresión. Ya no se admite convertir una expresión a una cadena utilizando (string).

Normalmente, esto no afecta a las aplicaciones de usuarios finales; sin embargo, si tu aplicación está convirtiendo manualmente expresiones de base de datos a cadenas usando (string) o invocando directamente el método __toString en la expresión, deberías actualizar tu código para invocar el método getValue en su lugar:

use Illuminate\Support\Facades\DB;
 
$expression = DB::raw('select 1');
 
$string = $expression->getValue(DB::connection()->getQueryGrammar());

Constructor de Excepciones de Consulta

Probabilidad de Impacto: Muy Baja

Ahora, el constructor de Illuminate\Database\QueryException acepta un nombre de conexión como su primer argumento. Si tu aplicación está lanzando manualmente esta excepción, deberías ajustar tu código en consecuencia.

Columnas ULID

Probabilidad de Impacto: Baja

Cuando las migraciones invocan el método ulid sin argumentos, la columna ahora se llamará ulid. En versiones anteriores de Laravel, invocar este método sin argumentos creaba una columna llamada erróneamente uuid:

$table->ulid();

Para especificar explícitamente un nombre de columna al invocar el método ulid, puedes pasar el nombre de la columna al método:

$table->ulid('ulid');

Eloquent

Propiedad "Dates" del Modelo

Probabilidad de Impacto: Media

La propiedad $dates obsoleta del modelo Eloquent ha sido eliminada. Ahora, tu aplicación debería usar la propiedad $casts:

protected $casts = [
'deployed_at' => 'datetime',
];

Localización

El Directorio de Idioma

Probabilidad de Impacto: Ninguna

Aunque no es relevante para aplicaciones existentes, el esqueleto de la aplicación Laravel ya no contiene el directorio lang de forma predeterminada. En su lugar, al escribir nuevas aplicaciones Laravel, se puede publicar utilizando el comando Artisan lang:publish:

php artisan lang:publish

Registros

Monolog 3

Probabilidad de Impacto: Media

La dependencia de Monolog de Laravel se ha actualizado a Monolog 3.x. Si estás interactuando directamente con Monolog dentro de tu aplicación, deberías revisar la guía de actualización de Monolog.

Si estás utilizando servicios de registro de terceros como BugSnag o Rollbar, es posible que necesites actualizar esos paquetes de terceros a una versión que admita Monolog 3.x y Laravel 10.x.

Colas

El Método Bus::dispatchNow

Probabilidad de Impacto: Baja

Los métodos obsoletos Bus::dispatchNow y dispatch_now han sido eliminados. En su lugar, tu aplicación debería usar los métodos Bus::dispatchSync y dispatch_sync, respectivamente.

Enrutamiento

Alias de Middleware

Probabilidad de Impacto: Opcional

En las nuevas aplicaciones Laravel, la propiedad $routeMiddleware de la clase App\Http\Kernel se ha renombrado a $middlewareAliases para reflejar mejor su propósito. Puedes renombrar esta propiedad en tus aplicaciones existentes si lo deseas; sin embargo, no es necesario.

Valores de Retorno de Limite de Tasa

Probabilidad de Impacto: Baja

Cuando se invoca el método RateLimiter::attempt, el valor devuelto por la clausura proporcionada ahora se devolverá también por el método. Si no se devuelve nada o null, el método attempt devolverá true:

$value = RateLimiter::attempt('key', 10, fn () => ['example'], 1);
 
$value; // ['example']

El Método Redirect::home

Probabilidad de Impacto: Muy Baja

El método obsoleto Redirect::home ha sido eliminado. En su lugar, tu aplicación debería redirigir a una ruta nombrada explícitamente:

return Redirect::route('home');

Pruebas

Burlado de Servicio

Probabilidad de Impacto: Media

El rasgo obsoleto MocksApplicationServices ha sido eliminado del framework. Este rasgo proporcionaba métodos de prueba como expectsEvents, expectsJobs y expectsNotifications.

Si tu aplicación utiliza estos métodos, te recomendamos que hagas la transición a Event::fake, Bus::fake y Notification::fake, respectivamente. Puedes obtener más información sobre el burlado a través de "fakes" en la documentación correspondiente al componente que estás intentando simular.

Validación

Mensajes de Regla de Validación Closure

Probabilidad de Impacto: Muy Baja

Cuando escribas reglas de validación personalizadas basadas en cierres, invocar el callback $fail más de una vez ahora anexará los mensajes a un array en lugar de sobrescribir el mensaje anterior. Normalmente, esto no afectará a tu aplicación.

Además, el callback $fail ahora devuelve un objeto. Si anteriormente estabas haciendo type-hinting al tipo de retorno de tu cierre de validación, es posible que necesites actualizar tu type-hint:

public function rules()
{
'name' => [
function ($attribute, $value, $fail) {
$fail('validation.translation.key')->translate();
},
],
}

Método Posterior de Form Request

Probabilidad de Impacto: Muy Baja

Dentro de las solicitudes de formularios, el método after ahora está reservado por Laravel. Si tus solicitudes de formularios definen un método after, el método debería cambiarse de nombre o modificarse para utilizar la nueva característica de "después de la validación" de Laravel en las solicitudes de formularios.

Misceláneo

También te animamos a ver los cambios en el repositorio de GitHub de laravel/laravel. Si bien muchos de estos cambios no son obligatorios, es posible que desees mantener estos archivos sincronizados con tu aplicación. Algunos de estos cambios se tratarán en esta guía de actualización, pero otros, como cambios en archivos de configuración o comentarios, no lo harán.

Puedes ver fácilmente los cambios con la herramienta de comparación de GitHub y elegir qué actualizaciones son importantes para ti. Sin embargo, muchos de los cambios mostrados por la herramienta de comparación de GitHub se deben a la adopción de tipos nativos de PHP por nuestra organización. Estos cambios son compatibles con versiones anteriores y la adopción de ellos durante la migración a Laravel 10 es opcional.