Actualizacion a laravel 11
Actualización a 11.0 desde 10.x
Tiempo estimado de actualización: 15 minutos
Intentamos documentar todos los cambios importantes posibles. Dado que algunos de estos cambios importantes se encuentran en partes oscuras del marco, solo una parte de estos cambios pueden afectar su aplicación. ¿Quieres ahorrar tiempo? Puede utilizar Laravel Shift para ayudar a automatizar las actualizaciones de su aplicación.
Actualización de dependencias
Probabilidad de impacto: alta
Se requiere PHP 8.2.0
Laravel ahora requiere PHP 8.2.0 o superior.
curl 7.34.0 Requerido
El cliente HTTP de Laravel ahora requiere curl 7.34.0 o superior.
Dependencias del compositor
Debes actualizar las siguientes dependencias en el archivo composer.json
de tu aplicación:
laravel/framework
a^11.0
nunomaduro/collision
a^8.1
laravel/breeze
a^2.0
(si está instalado)laravel/cashier
a^15.0
(si está instalado)laravel/dusk
a^8.0
(si está instalado)laravel/jetstream
a^5.0
(si está instalado)laravel/octane
a^2.3
(si está instalado)laravel/passport
a^12.0
(si está instalado)laravel/sanctum
a^4.0
(si está instalado)laravel/scout
a^10.0
(si está instalado)laravel/spark-stripe
a^5.0
(si está instalado)laravel/telescope
a^5.0
(si está instalado)livewire/livewire
a^3.4
(si está instalado)inertiajs/inertia-laravel
a^1.0
(si está instalado)
Si su aplicación utiliza Laravel Cashier Stripe, Passport, Sanctum, Spark Stripe o Telescope, deberá publicar sus migraciones en su aplicación. Cashier Stripe, Passport, Sanctum, Spark Stripe y Telescope ya no cargan migraciones automáticamente desde su propio directorio de migraciones. Por lo tanto, debes ejecutar el siguiente comando para publicar sus migraciones en tu aplicación:
php artisan vendor:publish --tag=cashier-migrations
php artisan vendor:publish --tag=passport-migrations
php artisan vendor:publish --tag=sanctum-migrations
php artisan vendor:publish --tag=spark-migrations
php artisan vendor:publish --tag=telescope-migrations
Además, debe revisar las guías de actualización de cada uno de estos paquetes para asegurarse de estar al tanto de cualquier cambio importante adicional:
Si ha instalado manualmente el instalador de Laravel, debe actualizar el instalador a través de Composer:
composer global require laravel/installer:^5.6
Finalmente, puede eliminar la dependencia de Composer doctrine/dbal
si la agregó previamente a su aplicación, ya que Laravel ya no depende de este paquete.
Estructura de la aplicación
Laravel 11 introduce una nueva estructura de aplicación predeterminada con menos archivos predeterminados. Es decir, las nuevas aplicaciones de Laravel contienen menos proveedores de servicios, middleware y archivos de configuración.
Sin embargo, no recomendamos que las aplicaciones Laravel 10 que se actualizan a Laravel 11 intenten migrar su estructura de aplicación, ya que Laravel 11 ha sido cuidadosamente ajustado para admitir también la estructura de la aplicación Laravel 10.
Autenticación
Repaso de contraseña
Probabilidad de impacto: baja
Laravel 11 repetirá automáticamente las contraseñas de su usuario durante la autenticación si el «factor de trabajo» de su algoritmo hash se ha actualizado desde la última vez que se hizo el hash de la contraseña.
Normalmente, esto no debería interrumpir su aplicación; sin embargo, si el campo «contraseña» de su modelo User
tiene un nombre distinto de password
, debe especificar el nombre del campo a través de la propiedad authPasswordName
del modelo:
protected $authPasswordName = 'custom_password_field';
Alternativamente, puede desactivar la repetición de contraseñas agregando la opción rehash_on_login
al archivo de configuración config/hashing.php
de su aplicación:
'rehash_on_login' => false,
El contrato UserProvider
Probabilidad de impacto: baja
El contrato Illuminate\Contracts\Auth\UserProvider
ha recibido un nuevo método rehashPasswordIfRequired
. Este método es responsable de volver a aplicar hash y almacenar la contraseña del usuario cuando el factor de trabajo del algoritmo de hash de la aplicación ha cambiado.
Si su aplicación o paquete define una clase que implementa esta interfaz, debe agregar el nuevo método rehashPasswordIfRequired
a su implementación. Se puede encontrar una implementación de referencia dentro de la clase Illuminate\Auth\EloquentUserProvider
:
public function rehashPasswordIfRequired(Authenticatable $user, array $credentials, bool $force = false);
El contrato Authenticatable
Probabilidad de impacto: baja
El contrato Illuminate\Contracts\Auth\Authenticatable
ha recibido un nuevo método getAuthPasswordName
. Este método es responsable de devolver el nombre de la columna de contraseña de su entidad autenticable.
Si su aplicación o paquete define una clase que implementa esta interfaz, debe agregar el nuevo método getAuthPasswordName
a su implementación:
public function getAuthPasswordName()
{
return 'password';
}
El modelo predeterminado User
incluido con Laravel recibe este método automáticamente ya que el método está incluido dentro del rasgo Illuminate\Auth\Authenticatable
.
La clase AuthenticationException
Probabilidad de impacto: muy baja
El método redirectTo
de la clase Illuminate\Auth\AuthenticationException
ahora requiere una instancia Illuminate\Http\Request
como primer argumento. Si detecta esta excepción manualmente y llama al método redirectTo
, debe actualizar su código en consecuencia:
if ($e instanceof AuthenticationException) {
$path = $e->redirectTo($request);
}
Modificar columnas
Probabilidad de impacto: alta
Al modificar una columna, ahora debe incluir explícitamente todos los modificadores que desea mantener en la definición de la columna después de cambiarla. Cualquier atributo que falte se eliminará. Por ejemplo, para conservar los atributos unsigned
, default
y comment
, debe llamar explícitamente a cada modificador al cambiar la columna, incluso si esos atributos se han asignado a la columna mediante una migración.
Por ejemplo, imagina que tienes una migración que crea una columna votes
con los atributos unsigned
, default
y comment
:
Schema::create('users', function (Blueprint $table) {
$table->integer('votes')->unsigned()->default(1)->comment('The vote count');
});
Luego, escribe una migración que cambia la columna para que también sea nullable
:
Schema::table('users', function (Blueprint $table) {
$table->integer('votes')->nullable()->change();
});
En Laravel 10, esta migración conservaría los atributos unsigned
, default
y comment
en la columna. Sin embargo, en Laravel 11, la migración ahora también debe incluir todos los atributos que se definieron previamente en la columna. En caso contrario, serán dados de baja:
Schema::table('users', function (Blueprint $table) {
$table->integer('votes')
->unsigned()
->default(1)
->comment('The vote count')
->nullable()
->change();
});
El método change
no cambia los índices de la columna. Por lo tanto, puede utilizar modificadores de índice para agregar o eliminar explícitamente un índice al modificar la columna:
// Add an index...
$table->bigIncrements('id')->primary()->change();
// Drop an index...
$table->char('postal_code', 10)->unique(false)->change();
Si no desea actualizar todas las migraciones de «cambios» existentes en su aplicación para conservar los atributos existentes de la columna, simplemente puede aplastar sus migraciones:
php artisan schema:dump
Una vez que sus migraciones hayan sido aplastadas, Laravel «migrará» la base de datos usando el archivo de esquema de su aplicación antes de ejecutar cualquier migraciones pendientes.
Tipos de punto flotante
Probabilidad de impacto: alta
Los tipos de columnas de migración double
y float
se han reescrito para que sean coherentes en todas las bases de datos.
El tipo de columna double
ahora crea una columna equivalente DOUBLE
sin dígitos ni lugares totales (dígitos después del punto decimal), que es la sintaxis SQL estándar. Por lo tanto, puede eliminar los argumentos de $total
y $places
:
$table->double('amount');
El tipo de columna float
ahora crea una columna equivalente FLOAT
sin dígitos ni lugares totales (dígitos después del punto decimal), pero con una especificación opcional $precision
para determinar el tamaño de almacenamiento como un archivo único de 4 bytes. -columna de precisión o una columna de doble precisión de 8 bytes. Por lo tanto, puede eliminar los argumentos para $total
y $places
y especificar el $precision
opcional al valor deseado y de acuerdo con la documentación de su base de datos:
$table->float('amount', precision: 53);
Los métodos unsignedDecimal
, unsignedDouble
y unsignedFloat
se han eliminado, ya que MySQL ha dejado de usar el modificador sin firmar para estos tipos de columnas y nunca se ha estandarizado en otros sistemas de bases de datos. Sin embargo, si desea continuar usando el atributo sin firmar obsoleto para estos tipos de columnas, puede encadenar el método unsigned
en la definición de la columna:
$table->decimal('amount', total: 8, places: 2)->unsigned();
$table->double('amount')->unsigned();
$table->float('amount', precision: 53)->unsigned();
Controlador MariaDB dedicado
Probabilidad de impacto: muy baja
En lugar de utilizar siempre el controlador MySQL al conectarse a bases de datos MariaDB, Laravel 11 agrega un controlador de base de datos dedicado para MariaDB.
Si su aplicación se conecta a una base de datos MariaDB, puede actualizar la configuración de conexión al nuevo controlador mariadb
para beneficiarse de las funciones específicas de MariaDB en el futuro:
'driver' => 'mariadb',
'url' => env('DB_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
// ...
Actualmente, el nuevo controlador MariaDB se comporta como el controlador MySQL actual con una excepción: el método de creación de esquemas uuid
crea columnas UUID nativas en lugar de columnas char(36)
.
Si sus migraciones existentes utilizan el método de creación de esquemas uuid
y elige utilizar el nuevo controlador de base de datos mariadb
, debe actualizar las invocaciones de su migración del método uuid
a char
para evitar cambios importantes o comportamientos inesperados:
Schema::table('users', function (Blueprint $table) {
$table->char('uuid', 36);
// ...
});
Tipos espaciales
Probabilidad de impacto: baja
Los tipos de columnas espaciales de las migraciones de bases de datos se han reescrito para que sean coherentes en todas las bases de datos. Por lo tanto, puede eliminar point
, lineString
, polygon
, geometryCollection
, multiPoint
, multiLineString
, multiPolygon
y multiPolygonZ
métodos de sus migraciones y utilice los métodos geometry
o geography
en su lugar:
$table->geometry('shapes');
$table->geography('coordinates');
Para restringir explícitamente el tipo o el identificador del sistema de referencia espacial para los valores almacenados en la columna en MySQL, MariaDB y PostgreSQL, puede pasar subtype
y srid
al método:
$table->geometry('dimension', subtype: 'polygon', srid: 0);
$table->geography('latitude', subtype: 'point', srid: 4326);
Los modificadores de columna isGeometry
y projection
de la gramática de PostgreSQL se han eliminado en consecuencia.
Eliminación de DBAL de doctrina
Probabilidad de impacto: baja
Se ha eliminado la siguiente lista de clases y métodos relacionados con Doctrine DBAL. Laravel ya no depende de este paquete y ya no es necesario registrar tipos de Doctrines personalizados para la creación y modificación adecuadas de varios tipos de columnas que anteriormente requerían tipos personalizados:
Illuminate\Database\Schema\Builder::$alwaysUsesNativeSchemaOperationsIfPossible
propiedad de clase- método
Illuminate\Database\Schema\Builder::useNativeSchemaOperationsIfPossible()
- método
Illuminate\Database\Connection::usingNativeSchemaOperations()
- método
Illuminate\Database\Connection::isDoctrineAvailable()
- método
Illuminate\Database\Connection::getDoctrineConnection()
- método
Illuminate\Database\Connection::getDoctrineSchemaManager()
- método
Illuminate\Database\Connection::getDoctrineColumn()
- método
Illuminate\Database\Connection::registerDoctrineType()
- método
Illuminate\Database\DatabaseManager::registerDoctrineType()
- directorio
Illuminate\Database\PDO
Illuminate\Database\DBAL\TimestampType
claseIlluminate\Database\Schema\Grammars\ChangeColumn
claseIlluminate\Database\Schema\Grammars\RenameColumn
clase- método
Illuminate\Database\Schema\Grammars\Grammar::getDoctrineTableDiff()
Además, ya no es necesario registrar tipos de Doctrine personalizados a través de dbal.types
en el archivo de configuración database
de su aplicación.
Si anteriormente estaba usando Doctrine DBAL para inspeccionar su base de datos y sus tablas asociadas, puede usar los nuevos métodos de esquema nativo de Laravel (Schema::getTables()
, Schema::getColumns()
, Schema::getIndexes()
, Schema::getForeignKeys()
, etc.) en cambio.
Métodos de esquema obsoletos
Probabilidad de impacto: muy baja
Los métodos obsoletos basados en Doctrine Schema::getAllTables()
, Schema::getAllViews()
y Schema::getAllTypes()
se han eliminado en favor de los nuevos métodos nativos de Laravel Schema::getTables()
, Schema::getViews()
y Schema::getTypes()
métodos.
Cuando se utiliza PostgreSQL y SQL Server, ninguno de los nuevos métodos de esquema aceptará una referencia de tres partes (por ejemplo, database.schema.table
). Por lo tanto, deberías usar connection()
para declarar la base de datos en su lugar:
Schema::connection('database')->hasTable('schema.table');
Método del generador de esquemas getColumnType()
Probabilidad de impacto: muy baja
El método Schema::getColumnType()
ahora siempre devuelve el tipo real de la columna dada, no el tipo equivalente de Doctrine DBAL.
Interfaz de conexión de base de datos
Probabilidad de impacto: muy baja
La interfaz Illuminate\Database\ConnectionInterface
ha recibido un nuevo método scalar
. Si está definiendo su propia implementación de esta interfaz, debe agregar el método scalar
a su implementación:
public function scalar($query, $bindings = [], $useReadPdo = true);
Fechas
Carbono 3
Probabilidad de impacto: media
Laravel 11 es compatible con Carbon 2 y Carbon 3. Carbon es una biblioteca de manipulación de fechas utilizada ampliamente por Laravel y los paquetes en todo el ecosistema. Si actualiza a Carbon 3, tenga en cuenta que los métodos diffIn*
ahora devuelven números de punto flotante y pueden devolver valores negativos para indicar la dirección del tiempo, lo cual es un cambio significativo con respecto a Carbon 2. Revise el registro de cambios de Carbon para obtener información detallada sobre cómo manejar estos y otros cambios.
Correo
El contrato Mailer
Probabilidad de impacto: muy baja
El contrato Illuminate\Contracts\Mail\Mailer
ha recibido un nuevo método sendNow
. Si su aplicación o paquete implementa manualmente este contrato, debe agregar el nuevo método sendNow
a su implementación:
public function sendNow($mailable, array $data = [], $callback = null);
Paquetes
Proveedores de servicios de publicación para la aplicación
Probabilidad de impacto: muy baja
Si ha escrito un paquete Laravel que publica manualmente un proveedor de servicios en el directorio app/Providers
de la aplicación y modifica manualmente el archivo de configuración config/app.php
de la aplicación para registrar el proveedor de servicios, debe actualizar su paquete para utilizar el nuevo método ServiceProvider::addProviderToBootstrapFile
.
El método addProviderToBootstrapFile
agregará automáticamente el proveedor de servicios que has publicado al archivo bootstrap/providers.php
de la aplicación, ya que la matriz providers
no existe dentro del archivo de configuración config/app.php
en las nuevas aplicaciones de Laravel 11.
use Illuminate\Support\ServiceProvider;
ServiceProvider::addProviderToBootstrapFile(Provider::class);
Colas
La interfaz BatchRepository
Probabilidad de impacto: muy baja
La interfaz Illuminate\Bus\BatchRepository
ha recibido un nuevo método rollBack
. Si está implementando esta interfaz dentro de su propio paquete o aplicación, debe agregar este método a su implementación:
public function rollBack();
Trabajos sincrónicos en transacciones de bases de datos
Probabilidad de impacto: muy baja
Anteriormente, los trabajos sincrónicos (trabajos que usaban el controlador de cola sync
) se ejecutaban inmediatamente, independientemente de si la opción de configuración after_commit
de la conexión de cola estaba establecida en true
o en afterCommit
se invocó el método en el trabajo.
En Laravel 11, los trabajos de cola sincrónicos ahora respetarán la configuración «después de la confirmación» de la conexión o trabajo de la cola.
Limitación de tasa
Limitación de velocidad por segundo
Probabilidad de impacto: media
Laravel 11 admite la limitación de velocidad por segundo en lugar de limitarse a la granularidad por minuto. Hay una variedad de posibles cambios importantes que debe tener en cuenta en relación con este cambio.
El constructor de clase GlobalLimit
ahora acepta segundos en lugar de minutos. Esta clase no está documentada y normalmente no la utilizaría su aplicación:
new GlobalLimit($attempts, 2 * 60);
El constructor de clase Limit
ahora acepta segundos en lugar de minutos. Todos los usos documentados de esta clase se limitan a constructores estáticos como Limit::perMinute
y Limit::perSecond
. Sin embargo, si crea una instancia de esta clase manualmente, debe actualizar su aplicación para proporcionar segundos al constructor de la clase:
new Limit($key, $attempts, 2 * 60);
La propiedad decayMinutes
de la clase Limit
ha cambiado de nombre a decaySeconds
y ahora contiene segundos en lugar de minutos.
Los constructores de clases Illuminate\Queue\Middleware\ThrottlesExceptions
y Illuminate\Queue\Middleware\ThrottlesExceptionsWithRedis
ahora aceptan segundos en lugar de minutos:
new ThrottlesExceptions($attempts, 2 * 60);
new ThrottlesExceptionsWithRedis($attempts, 2 * 60);
Raya de cajero
Actualización de Cashier Stripe
Probabilidad de impacto: alta
Laravel 11 ya no es compatible con Cashier Stripe 14.x. Por lo tanto, debe actualizar la dependencia de Laravel Cashier Stripe de su aplicación a ^15.0
en su archivo composer.json
.
Cashier Stripe 15.0 ya no carga automáticamente las migraciones desde su propio directorio de migraciones. En su lugar, debes ejecutar el siguiente comando para publicar las migraciones de Cashier Stripe en tu aplicación:
php artisan vendor:publish --tag=cashier-migrations
Revise la guía completa de actualización de Cashier Stripe para conocer cambios importantes adicionales.
Chispa (raya)
Actualización de Spark Stripe
Probabilidad de impacto: alta
Laravel 11 ya no es compatible con Laravel Spark Stripe 4.x. Por lo tanto, debes actualizar la dependencia de Laravel Spark Stripe de tu aplicación a ^5.0
en tu archivo composer.json
.
Spark Stripe 5.0 ya no carga automáticamente las migraciones desde su propio directorio de migraciones. En su lugar, debes ejecutar el siguiente comando para publicar las migraciones de Spark Stripe en tu aplicación:
php artisan vendor:publish --tag=spark-migrations
Revise la guía completa de actualización de Spark Stripe para conocer cambios importantes adicionales.
Pasaporte
Actualización de pasaporte
Probabilidad de impacto: alta
Laravel 11 ya no es compatible con Laravel Passport 11.x. Por lo tanto, debe actualizar la dependencia de Laravel Passport de su aplicación a ^12.0
en su archivo composer.json
.
Passport 12.0 ya no carga automáticamente las migraciones desde su propio directorio de migraciones. En su lugar, debes ejecutar el siguiente comando para publicar las migraciones de Passport en tu aplicación:
php artisan vendor:publish --tag=passport-migrations
Además, el tipo de concesión de contraseña está deshabilitado de forma predeterminada. Puede habilitarlo invocando el método enablePasswordGrant
en el método boot
de AppServiceProvider
de su aplicación:
public function boot(): void
{
Passport::enablePasswordGrant();
}
Santuario
Actualizando Santuario
Probabilidad de impacto: alta
Laravel 11 ya no es compatible con Laravel Sanctum 3.x. Por lo tanto, debes actualizar la dependencia de Laravel Sanctum de tu aplicación a ^4.0
en tu archivo composer.json
.
Sanctum 4.0 ya no carga automáticamente las migraciones desde su propio directorio de migraciones. En su lugar, debes ejecutar el siguiente comando para publicar las migraciones de Sanctum en tu aplicación:
php artisan vendor:publish --tag=sanctum-migrations
Luego, en el archivo de configuración config/sanctum.php
de su aplicación, debe actualizar las referencias al middleware authenticate_session
, encrypt_cookies
y validate_csrf_token
a lo siguiente:
'middleware' => [
'authenticate_session' => Laravel\Sanctum\Http\Middleware\AuthenticateSession::class,
'encrypt_cookies' => Illuminate\Cookie\Middleware\EncryptCookies::class,
'validate_csrf_token' => Illuminate\Foundation\Http\Middleware\ValidateCsrfToken::class,
],
Telescopio
Actualización del telescopio
Probabilidad de impacto: alta
Laravel 11 ya no es compatible con Laravel Telescope 4.x. Por lo tanto, debe actualizar la dependencia del Laravel Telescope de su aplicación a ^5.0
en su archivo composer.json
.
Telescope 5.0 ya no carga automáticamente las migraciones desde su propio directorio de migraciones. En su lugar, debes ejecutar el siguiente comando para publicar las migraciones de Telescope en tu aplicación:
php artisan vendor:publish --tag=telescope-migrations
Paquete Spatie una vez
Probabilidad de impacto: media
Laravel 11 ahora proporciona su propia función once
para garantizar que un cierre determinado solo se ejecute una vez. Por lo tanto, si su aplicación depende del paquete spatie/once
, debe eliminarlo del archivo composer.json
de su aplicación para evitar conflictos.
Misceláneas
También le recomendamos que vea los cambios en el repositorio laravel/laravel
de GitHub. Si bien muchos de estos cambios no son necesarios, es posible que desee mantener estos archivos sincronizados con su aplicación. Algunos de estos cambios se cubrirán en esta guía de actualización, pero otros, como los cambios en los archivos de configuración o los comentarios, no. Puede ver fácilmente los cambios con la herramienta de comparación de GitHub y elegir qué actualizaciones son importantes para usted.