Cambios de alto impacto
Cambios de mediano impacto
- Carbon 1.x ya no está soportado
- Cliente por defecto de Redis
- Método
Capsule::table
de base de datos - Arrayable y
toArray
de Eloquent - Método
BelongsTo::update
de Eloquent - Tipos de clave primaria en Eloquent
- Métodos de configuración regional
Lang::trans
yLang::transChoice
- Método de configuración regional
Lang::getFromJson
- Límite de reintento de cola
- Reenviar ruta de verificación de correo electrónico
- Cambio de ruta de verificación de correo electrónico
- Facade
Input
Actualizando a 6.0 desde 5.8
Tiempo de actualización estimado: una hora
Intentamos documentar cada posible cambio de ruptura (breaking change). Dado que algunos de estos cambios de ruptura se encuentran en las partes oscuras del framework, solo una parte de estos cambios puede afectar tu aplicación.
PHP 7.2 Obligatorio
Probabilidad de impacto: Medio
PHP 7.1 ya no se mantendrá activamente a partir de diciembre de 2019. Por lo tanto, Laravel 6.0 requiere PHP 7.2 o superior.
Actualizando dependencias
Actualiza tu dependencia laravel/framework
a ^6.0
en tu archivo composer.json
.
Luego, revisa los paquetes de terceros consumidos por tu aplicación y verifica estás usando la versión adecuada para soportar Laravel 6.
Autorización
Recursos autorizados y viewAny
Probabilidad de impacto: Alto
Las políticas de autorización adjuntadas a los controladores que utilizan el método authorizeResource
ahora deberían definir un método viewAny
, que se llamará cuando un usuario acceda al método index
del controlador. De lo contrario, las llamadas al método index
del controlador serán rechazadas como no autorizadas.
Respuestas de autorización
Probabilidad de impacto: Bajo
La firma del constructor de la clase Illuminate\Auth\Access\Response
ha cambiado. Debes actualizar tu código de acuerdo a ello. Si no estás manualmente construyendo respuestas y sólo estás usando los métodos de instancia allow
y deny
dentro de tus políticas, no se requiere ningún cambio:
/** * Create a new response. * * @param bool $allowed * @param string $message * @param mixed $code * @return void */ public function __construct($allowed, $message = '', $code = null)
Devolviendo respuestas «Deny»
Probabilidad de impacto: Bajo
En versiones anteriores de Laravel, no era necesario devolver el valor del método deny
de tus métodos de política ya que una excepción se lanzaba de forma automática. Sin embargo, de acuerdo a la documentación de Laravel, se debe ahora retornar el valor del método deny
desde tus políticas:
public function update(User $user, Post $post) { if (! $user->role->isEditor()) { return $this->deny("Debes ser Editor para editar este post.") } return $user->id === $post->user_id; }
La interfaz Illuminate\Contracts\Auth\Access\Gate
Probabilidad de impacto: Bajo
La interfaz Illuminate\Contracts\Auth\Access\Gate
ha recibido un nuevo método inspect
. Si estás implementando esta interfaz manualmente, debes agregar este método en tu implementación.
Carbon
Carbon 1.x ya no está soportado
Probabilidad de impacto: Medio
Carbon 1.x ya no está soportado debido a que la fecha de fin de mantenimiento está cerca. Por favor actualiza tu aplicación a Carbon 2.0.
Configuración
La variable de entorno AWS_REGION
Probabilidad de impacto: Opcional
Si planeas usar Laravel Vapor, debes actualizar todas las apariciones de AWS_REGION
dentro de tu directorio config
a AWS_DEFAULT_REGION
. Además, debes actualizar el nombre de esta variable de entorno en tu archivo .env
.
Cliente por defecto de Redis
Probabilidad de impacto: Medio
El cliente por defecto de Redis ha cambiado de predis
a phpredis
. Para seguir usando predis
, asegúrate que la opción de configuración redis.client
está establecida como predis
en tu archivo de configuración config/database.php
.
Almacén de Caché DynamoDB
Probabilidad de impacto: Opcional
Si planeas usar Laravel Vapor, debes actualizar tu archivo config/cache.php
para incluir el almacén de dynamodb
.
<?php return [ ... 'stores' => [ ... 'dynamodb' => [ 'driver' => 'dynamodb', 'key' => env('AWS_ACCESS_KEY_ID'), 'secret' => env('AWS_SECRET_ACCESS_KEY'), 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), 'table' => env('DYNAMODB_CACHE_TABLE', 'cache'), 'endpoint' => env('DYNAMODB_ENDPOINT'), ], ], ... ];
Variables de Entorno SQS
Probabilidad de impacto: Opcional
Si planeas usar Laravel Vapor, debes actualizar tu archivo config/queue.php
para incluir las variables de entorno de conexión sqs
actualizadas.
<?php return [ ... 'connections' => [ ... 'sqs' => [ 'driver' => 'sqs', 'key' => env('AWS_ACCESS_KEY_ID'), 'secret' => env('AWS_SECRET_ACCESS_KEY'), 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), 'queue' => env('SQS_QUEUE', 'your-queue-name'), 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), ], ], ... ];
Base de datos
El método table
de Capsule
Probabilidad de impacto: Medio
Este cambio sólo aplica para aplicaciones no Laravel que estén usando a illuminate/database
como una dependencia.
La firma del método table
de la clase Illuminate\Database\Capsule\Manager
se ha actualizado para aceptar un alias de tabla como segundo argumento. Si estás usando illuminate/database
fuera de una aplicación de Laravel, debes actualizar cualquier llamado a este método de acuerdo con:
/** * Get a fluent query builder instance. * * @param \Closure|\Illuminate\Database\Query\Builder|string $table * @param string|null $as * @param string|null $connection * @return \Illuminate\Database\Query\Builder */ public static function table($table, $as = null, $connection = null)
El método cursor
Probabilidad de impacto: Bajo
El método cursor
ahora retorna una instancia de Illuminate\Support\LazyCollection
en vez de un Generator
. LazyCollection
puede ser iterada como un generador:
$users = App\User::cursor(); foreach ($users as $user) { // }
Eloquent
El método BelongsTo::update
Probabilidad de impacto: Medio
Por coherencia, el método update
de la relación BelongsTo
ahora funciona como una consulta de actualización ad-hoc, lo que significa que no proporciona protección de asignación masiva ni dispara eventos Eloquent. Esto hace que la relación sea consistente con los métodos update
de todos los demás tipos de relaciones.
Si deseas actualizar un modelo asociado a través de una relación BelongsTo
recibiendo protección y eventos de actualización de asignación masiva, debes llamar al método update
en el mismo modelo:
// Consulta Ad-hoc... sin protección o eventos de asignación masiva... $post->user()->update(['foo' => 'bar']); // Actualización del modelo... proporciona protección y eventos de asignación masiva... $post->user->update(['foo' => 'bar']);
Arrayable y toArray
Probabilidad de impacto: Medio
El método toArray
del modelo Eloquent ahora convertirá cualquier atributo que implemente Illuminate\Contracts\Support\Arrayable
a un arreglo.
Declaración del tipo de clave primaria
Probabilidad de impacto: Medio
Laravel 6.0 ha recibido optimizaciones de rendimiento para tipos de clave que usa entero. Si estás utilizando una cadena (string) como clave primaria de tu modelo, debes declarar el tipo de clave utilizando la propiedad $keyType
en tu modelo:
/** * The "type" of the primary key ID. * * @var string */ protected $keyType = 'string';
Verificación de correo electrónico
Reenviar ruta de verificación de correo electrónico
Probabilidad de impacto: Medio
Para evitar posibles ataques de CSRF, la ruta email/resend
registrada por el enrutador cuando se utiliza la verificación de correo electrónico incorporada en Laravel se ha actualizado de una ruta GET
a una ruta POST
. Por lo tanto, deberás actualizar tu frontend para enviar el tipo de solicitud adecuado a esta ruta. Por ejemplo, si estás utilizando la plantilla de verificación de correo electrónico por defecto de Laravel sería:
{{ __('Before proceeding, please check your email for a verification link.') }} {{ __('If you did not receive the email') }}, <form class="d-inline" method="POST" action="{{ route('verification.resend') }}"> @csrf <button type="submit" class="btn btn-link p-0 m-0 align-baseline"> {{ __('click here to request another') }} </button>. </form>
La interfaz MustVerifyEmail
Probabilidad de impacto: Bajo
Se ha agregado un nuevo método getEmailForVerification
a la interfaz Illuminate\Contracts\Auth\MustVerifyEmail
. Si estás implementando manualmente esta interfaz, debes implementar este método, el cual debe devolver la dirección de correo electrónico asociada del objeto. Si tu modelo App\User
está utilizando el trait Illuminate\Auth\MustVerifyEmail
, no se requieren cambios, ya que este trait implementa este método por ti.
Cambio de ruta de verificación de correo electrónico
Probabilidad de impacto: Medio
La ruta para verificar los correos electrónicos ha cambiado de: /email/verify/{id}
a /email/verify/{id}/{hash}
. Cualquier correo electrónico de verificación que se haya enviado antes de actualizar a Laravel 6.x ya no será válido y mostrará una página 404. Si deseas, puedes definir una ruta que coincida con la ruta de la URL de verificación anterior y mostrar un mensaje informativo para tus usuarios que les pida que vuelvan a verificar su dirección de correo electrónico.
Helpers
Paquete para helpers String y Array
Probabilidad de impacto: Alto
Todos los helpers str_
y array_
se han movido al nuevo paquete de Composer laravel/helpers
y se han eliminado del framework. Si lo deseas, puedes actualizar todas las llamadas a estos helpers para usar las clases Illuminate\Support\Str
y Illuminate\Support\Arr
. Alternativamente, puede agregar el nuevo paquete laravel/helpers
a tu aplicación para continuar usando estos helpers:
composer require laravel/helpers
Configuración regional
Los métodos Lang::trans
y Lang::transChoice
Probabilidad de impacto: Medio
Los métodos Lang::trans
y Lang::transChoice
del traductor han sido renombrados a Lang::get
y Lang::choice
respectivamente.
Además, si estás manualmente implementando la interfaz Illuminate\Contracts\Translation\Translator
, debes actualizar tus implementaciones de los métodos trans
y transChoice
a get
y choice
.
El método Lang::getFromJson
Probabilidad de impacto: Medio
Los métodos Lang::get
y Lang::getFromJson
se han consolidado. Las llamadas al método Lang::getFromJson
deben ser actualizadas para llamar a Lang::get
.
Debes ejecutar el comando Artisan php artisan view:clear
para evitar errores de Blade relacionados a la eliminación de Lang::transChoice
, Lang::trans
, y Lang::getFromJson
.
Correo Electrónico
Los controladores Mandrill y SparkPost se eliminaron
Probabilidad de impacto: Bajo
Los controladores de correo electrónico mandrill
y sparkpost
se han eliminado. Si te gustaría continuar usando uno de estos controladores, te animamos a adoptar un paquete mantenido por la comunidad que proporcione el controlador.
Notificaciones
Rutas de Nexmo eliminadas
Probabilidad de impacto: Bajo
Una parte persistente del canal de notificación de Nexmo fue eliminada del núcleo del framework. Si estás confiando en las rutas de notificaciones de Nexmo debes manualmente implementar el método routeNotificationForNexmo
en tu entidad notificable como se describe en la documentación.
Restablecimiento de contraseña
Validación de contraseña
Probabilidad de impacto: Bajo
El PasswordBroker
ya no restringe ni valida las contraseñas. La validación de la contraseña ya estaba siendo manejada por la clase ResetPasswordController
, haciendo que las validaciones del broker fueran redundantes e imposibles de personalizar. Si estás utilizando manualmente el PasswordBroker
(o la facade de Password
) fuera del ResetPasswordController
incorporado, debes validar todas las contraseñas antes de pasarlas al broker.
Colas
Límite de reintento de cola
Probabilidad de impacto: Medio
En versiones anteriores de Laravel, el comando php artisan queue:work
reintenta los trabajos indefinidamente. A partir de Laravel 6.0, este comando ahora intentará un trabajo una vez por defecto. Si deseas forzar que los trabajos se intenten indefinidamente, puedes pasar 0
a la opción --tries
:
php artisan queue:work --tries=0
Además, por favor garantiza que la base de datos de tu aplicación contenga un tabla failed_jobs
. Puedes generar una migración para esta tabla usando el comando de Artisan queue:failed-table
:
php artisan queue:failed-table
Solicitudes HTTP
El facade Input
Probabilidad de impacto: Medio
El facade Input
que era principalmente un duplicado de la facade Request
se ha eliminado. Si estás usando el método Input::get
debes ahora llamar al método Request::input
. Todas las demás llamadas a la facade Input
pueden simplemente actualizarse para usar la facade Request
.
Programación de tareas
El método between
Probabilidad de impacto: Bajo
En versiones anteriores de Laravel, el método between
del programador de tareas mostraba un comportamiento confuso a través de los límites de la fecha. Por ejemplo:
$schedule->command('list')->between('23:00', '4:00');
Para la mayoría de los usuarios, el comportamiento esperado de este método sería ejecutar el comando list
cada minuto durante todos los minutos entre las 23:00 y las 4:00. Sin embargo, en versiones anteriores de Laravel, el programador ejecuta el comando list
cada minuto entre las 4:00 y las 23:00, esencialmente intercambiando los umbrales de tiempo. En Laravel 6.0, este comportamiento se ha corregido.
Almacenamiento
Controlador de almacenamiento Rackspace eliminado
Probabilidad de impacto: Bajo
Se ha eliminado el controlador de almacenamiento rackspace
. Si deseas continuar usando Rackspace como proveedor de almacenamiento, te recomendamos que adoptes un paquete de tu elección mantenido por la comunidad que proporcione este controlador.
Generación de URL
Generación de rutas URL y parámetros extras
En versiones previas de Laravel, pasar parámetros de arreglos asociativos al helper route
o al método URL::route
podía ocasionar el uso de estos parámetros como valores de URI cuando generabas URLs para rutas con parámetros opcionales, incluso si el valor del parámetro no tenía una llave que coincidiera con las llaves esperadas. A partir de Laravel 6.0, estos valores se usará como parte del «query string». Por ejemplo, considera la siguiente ruta:
Route::get('/profile/{location?}', function ($location = null) { // })->name('profile'); // Laravel 5.8: http://example.com/profile/active echo route('profile', ['status' => 'active']); // Laravel 6.0: http://example.com/profile?status=active echo route('profile', ['status' => 'active']);
La función helper action
y el método URL::action
también fueron afectados por este cambio:
Route::get('/profile/{id}', 'ProfileController@show'); // Laravel 5.8: http://example.com/profile/1 echo action('ProfileController@show', ['profile' => 1]); // Laravel 6.0: http://example.com/profile?profile=1 echo action('ProfileController@show', ['profile' => 1]);
Validación
El Método validationData
de FormRequest
Probabilidad de impacto: Bajo
El Método validationData
de FormRequest ha sido cambiado de protected
a public
. Si estás sobrescribiendo este método en tu implementación, debes cambiar la visibilidad a public
.
Misceláneos
También te recomendamos que veas los cambios en el repositorio de Github laravel/laravel
. Si bien muchos de estos cambios no son necesarios, 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 los cambios en los archivos de configuración o los comentarios, no lo estarán. Puedes ver fácilmente los cambios con la herramienta de comparación GitHub y elegir qué actualizaciones son importantes para ti.
:::
Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.
Lección anterior Notas de Lanzamiento - Documentación de Laravel 6 Lección siguiente Guía de contribución - Documentación de Laravel 6