Skip to main content

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 casts de 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 en composer.json.
Si usas paquetes, actualízalos también.
Después, instala las dependencias con el siguiente comando.
Si usas Cashier Stripe, Passport, Sanctum, Spark Stripe o Telescope, necesitas publicar las migraciones en tu aplicación.
Si usas el instalador de Laravel, actualízalo también.
Si antes habías añadido manualmente 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.php se ha eliminado y se ha integrado en bootstrap/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 con php 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 modelo User no es password, indícalo con la propiedad authPasswordName del modelo.
Para desactivar esta funcionalidad, añade lo siguiente en 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.
Si no quieres actualizar todas las migraciones existentes, haz un squash de las migraciones.

Cambios en los tipos de coma flotante

Impacto: alto Se han unificado los tipos de columna double y float de migraciones entre todas las bases de datos.
Los métodos 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 driver mariadb 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étodos point, lineString, polygon, etc., usa geometry o geography.
Si quieres indicar explícitamente el tipo o el sistema de referencia espacial, pasa 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
Para inspeccionar la base de datos, usa los nuevos métodos nativos: 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étodos diffIn* 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 clases GlobalLimit y Limit reciben ahora los valores en segundos.
La propiedad 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 array providers 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 en composer.json a ^4.0. Sanctum 4.0 ya no carga automáticamente las migraciones. Publícalas con el siguiente comando.
Además, actualiza la configuración de middleware de config/sanctum.php.

Paquete Spatie Once

Impacto: medio Laravel 11 ofrece ahora su propia función once. 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.

Referencias

Última modificación el 13 de julio de 2026