Laravel 5.8

Luego de un poco de espera después del lanzamiento de Laravel 5.8 es momento de actualizar nuestras aplicaciones a la nueva versión. Veamos a continuación los cambios más significativos que debemos realizar:

Requisitos

Antes de hacer cualquier paso de la actualización debemos confirmar que nuestra aplicación puede actualizarse a Laravel 5.8 y esto es:

  • La aplicación está desarrollada en Laravel 5.7. En caso contrario, debes actualizarla a esa versión. En Styde tenemos guías para actualizar Laravel desde anteriores versiones.
  • Confirmar que los paquetes de terceros usados en la aplicación pueden trabajar con Laravel 5.8.

Recomendaciones

  • Usa Git para evitar quedarte estancado si la actualización sale mal, te recomendamos crear una nueva rama para realizar la actualización – de esa manera el código de tu proyecto con la versión anterior estará respaldado.
  • Si estás usando pruebas automatizadas verifica que todas las pruebas pasan antes de iniciar el proceso de actualización.

Pasos para actualizar a Laravel 5.8

Actualización de dependencias

En el archivo composer.json actualiza las dependencias del framework a 5.8.*, modificando la siguiente línea:

"laravel/framework": "5.8.*"

Actualiza también los paquetes de desarrollo Collision y PHPUnit de esta manera:

"nunomaduro/collision": "^3.0",
"phpunit/phpunit": "^7.5"

De igual forma, actualiza todos los paquetes de terceros consumidos por la aplicación, previa verificación de soporte para Laravel 5.8.

En el video Roles y Permisos con Laravel 5.8 y Bouncer de nuestro Curso de Técnicas de autorización con Laravel te mostramos un ejemplo de cómo actualizar el paquete Bouncer.

Por último, ejecuta composer update para que se instalen las actualizaciones.

Si tienes pruebas en tu aplicación es momento de ejecutarlas nuevamente para verificar que todo siga funcionando correctamente, sino realiza pruebas de todos los módulos y páginas de tu aplicación de forma manual en el navegador.

Hay cambios adicionales a tomar en cuenta al actualizar tu proyecto y dependerá de lo que estés usando en él:

Cambios importantes

Caché

A partir de Laravel 5.8 se ha adaptado el sistema de caché para cumplir con las especificaciones del estándar PSR-16. Por tanto se ha cambiado la forma en cómo se maneja y se almacenan elementos en caché, estos cambios son:

El tiempo de vida (TTL) de los elementos de caché ha cambiado de minutos a segundos para permitir configurar mejor el tiempo de caducidad al almacenar los elementos. Se actualizaron los métodos put, putMany, add, remember y setDefaultCacheTime de la clase Illuminate\Cache\Repository para adaptarse al TTL en segundos. Por tanto, debes actualizar para que se exprese en segundos.

Alternativamente, puedes pasar una instancia de DateTime que indica cuándo debe expirar el elemento, es decir:

<?php
// Se almacenan el elemento por 30 segundos...
Cache::put('foo', 'bar', 30);

// Se almacenan el elemento por 30 segundos...
Cache::put('foo', 'bar', now()->addSeconds(30));

También se cambió el comportamientos del argumento TTL de los métodos put, putMany y add puesto que si ejecutas Cache::put('foo', 'bar') es decir, con el TTL null este elemento será almacenado para siempre. Contrario a lo que ocurría en versiones anterior cuando ignoraba dicho llamado y no guardaba el elemento. De igual forma, para putMany cada elemento se almacenará indefinidamente cuando TTL sea null.

Además, para cumplir con el PSR-16 los métodos put y forever de la interfaz Illuminate\Contracts\Cache\Repository y los métodos put, putMany y forever de la interfaz Illuminate\Contracts\Cache\Store devolverán un booleano en vez de void.

Por otro lado, también se ha hecho mejoras en la seguridad de bloqueo de caché puesto que la característica «atomic lock» proporcionada por algunos controladores de caché podría tener un comportamiento no deseado llevando a la liberación prematura de los bloqueos, puedes revisar sobre los cambios en Lock Safety Improvements.

Directorio de archivos markdown de mails

¿Has publicado las plantillas para enviar emails usando el comando vendor:publish? .Entonces debes cambiar el nombre del directorio /resources/views/vendor/mail/markdown por text.

Además, si has sobreescrito el método markdownComponentPaths debes cambiar su nombre a textComponentPaths para que coincida con la clase padre.

Parseo de variables de entorno

El paquete phpdotenv que es usado para parsear archivos .env ha liberado una nueva versión que podría impactar los resultados retornados desde el helper env. Específicamente, el carácter # en un valor sin comillas ahora será considerado como un comentario en lugar de parte del valor. Es decir que de una variable ENV_VALUE=foo#bar al ser llamada con el helper env('ENV_VALUE'); ahora devolverá foo en vez de foo#bar. Para que mantengas el comportamiento anterior puedes envolver los valores de entorno en comillas así: ENV_VALUE="foo#bar"

Para más información, por favor revisa la guía de actualización de phpdotenv

Canales de notificación Nexmo / Slack

Los canales de notificación de Nexmo y Slack se han extraído en paquetes oficiales. Para usar estos canales en su aplicación, instala los siguientes paquetes:

composer require laravel/nexmo-notification-channel
composer require laravel/slack-notification-channel

Otros cambios a tomar en cuenta si usas estas características / tecnologías en tu aplicación

SQLite

A partir de Laravel 5.8, la versión SQLite más antigua soportada es SQLite 3.7.11. Si estás utilizando una versión anterior de SQLite, debes actualizarla (se recomienda SQLite 3.8.8+).

Usa las clases Str y Arr en vez de helpers

Todos los helpers globales array_* y str_* han sido puestos en desuso y serán eliminados en Laravel 5.9. Debes usar los métodos de Illuminate\Support\Arr y Illuminate\Support\Str directamente.

Por ejemplo, para el factory del modelo User generamos un valor para el atributoremember_token de esta manera: str_random(10), por lo que debes cambiarlo a:

<?php
//...
'remember_token' => Str::random(10)

No olvides importar la clase Illuminate\Support\Str

Adicionalmente, puedes agregar los alias de estas clases en el arreglo aliases del archivo config/app.php

<?php
//...
'aliases' => [
    // agrégalos en el orden alfabético que le corresponda

    'Arr' => Illuminate\Support\Arr::class,
    'Str' => Illuminate\Support\Str::class,
],

El impacto de este cambio se ha marcado como «medio» debido a que las funciones helpers se han trasladado al nuevo paquete laravel/helpers que ofrece una capa de compatibilidad para todas las funciones globales de arreglos y de cadenas.

Ruta de restablecimiento de contraseña

Cuando usas php artisan make:auth, para añadir el sistema de registro, login y restablecimiento de contraseñas que trae Laravel por defecto, se incluyen en el archivo routes/web.php las rutas necesarias con Auth::routes();. En este conjunto de rutas se encuentra password.reset. Si has hecho un llamado a ésta con el helper route, debes pasar el token como un parámetro explícito:

<?php
route('password.reset', ['token' => $token]);

Adicionalmente, si has definido tu propia ruta password.reset debes asegurarte de que contenga un parámetro {token} como por ejemplo:

<?php
Route::get('contrasena/reset/{token}', 'Auth\ResetPasswordController@showResetForm')
     ->name('password.reset');

Valores no citados para JSON en MySQL

El constructor de consultas ahora devolverá valores JSON no citados al usar MySQL y MariaDB. Este comportamiento es consistente con las otras bases de datos soportadas:

<?php
$value = DB::table('users')->value('options->language');
    
dump($value);
    
// Laravel 5.7...
'"en"'
    
// Laravel 5.8...
'en'

Como resultado el operador ->> ya no es soportado ni necesario.

Modelos con nombre que terminan en plurales irregulares

Laravel 5.8 pluraliza correctamente los nombres de las tablas de modelos compuestos de dos o más palabras que terminen en una palabra irregular, es decir:

<?php
// Laravel 5.7...
App\Feedback.php  // -> feedback (correctamente pluralizado)
App\UserFeedback.php // -> user_feedbacks (incorrectamente pluralizado)

// Laravel 5.8
App\Feedback.php // -> feedback (correctamente pluralizado)
App\UserFeedback.php // -> user_feedback (correctamente pluralizado)

Si alguno de tus modelos es afectado por esto, puedes continuar usando el nombre de la tabla anterior definiendo la propiedad $table en tu modelo.

Modelos personalizados para pivote con IDs incrementales

Si has definido una relación de muchos a muchos que usa un modelo personalizado para tablas pivote, y ese modelo tiene una clave primaria autoincremental, debes asegurarte de que tu clase de modelo personalizado para pivote defina una propiedad incrementing que se establece en true:

<?php
//...
public $incrementing = true;

Conversión (Casting) automática de la propiedad soft-deleted deleted_at

La propiedad deleted_at ahora se convertirá automáticamente en una instancia de Carbon cuando tu modelo Eloquent use el trait Illuminate\Database\Eloquent\SoftDeletes. Ahora solo necesitarás definirla explícitamente en el modelo cuando la establezcas como un tipo de dato diferente de Carbon.

Valores de solo lectura con el helper env

¿Llamas a las variables de entorno con el helper env? Debes estar pendiente que ahora este helper trata a las variables como inmutables. Así que si quisieras cambiar una variable de entorno en tiempo de ejecución, considera usar un valor de configuración y llamar a las variables con el helper config:

<?php
//Comportamiento anterior:
    dump(env('APP_ENV')); // local
    putenv('APP_ENV=staging');
    dump(env('APP_ENV')); // staging

//Nuevo comportamiento:
    dump(env('APP_ENV')); // local
    putenv('APP_ENV=staging');
    dump(env('APP_ENV')); // local

Service Providers diferidos

La propiedad booleana defer en el proveedor de servicios que se usa para indicar si un proveedor está diferido ha quedado en desuso. Para marcar el proveedor de servicios como diferido, debes implementar la interfaz Illuminate\Contracts\Support\DeferrableProvider.

Servicios etiquetados en el contenedor

En versiones anteriores de Laravel, el contenedor de servicios resolvía inmediatamente todos los servicios etiquetados con un tag, sin embargo, muchas veces los servicios no eran usados. Es por ello que a partir de Laravel 5.8 los servicios etiquetados serán instanciados de forma diferida; es decir, cuando realmente se necesiten. Debido a este cambio, ahora el método tagged devolverá un iterable en vez de un array Además ya no será posible llamar a un servicio etiquetado de esta manera: $container->tagged('foo')[0]

Pruebas

Los métodos setUp y tearDown ahora requieren un tipo de retorno void:

<?php
//...
protected function setUp(): void
protected function tearDown(): void

Por otro lado, Laravel 5.8 usa PHPUnit 7 por defecto; sin embargo, si estás usando PHP 7.2 o superior puedes actualizar a PHPUnit 8. Puedes ver la lista completa de cambios en el anuncio de la versión de PHPUnit 8.

Pheanstalk 4.0

Laravel 5.8 proporciona soporte para la versión ~4.0 de los paquetes de colas Pheanstalk. Si estás utilizando el paquetes de terceros Pheanstalk en tu aplicación, actualiza a la versión ~4.0 a través de Composer.

Longitud del atributo password en el modelo User

Por otro lado, para los proyectos creados en Laravel 5.8 debes estar al tanto que ha sido cambiado la longitud de la contraseña requerida al registrarse o restablecer una contraseña a un mínimo de ocho caracteres. Por tanto, la contraseña por defecto creada por el Factory del modelo User cambió de secret a password.

Además, todas las migraciones creadas ahora usarán el tipo de dato bigIncrements para las columnas id por defecto (antes era usado el tipo de dato increments). A pesar que esto no afecta el código de un proyecto ya en funcionamiento, debes asegurarte de definir el tipo de datos equivalente para las claves foráneas, como revisamos en el video Roles y Permisos con Laravel 5.8 y Bouncer.

Hay muchos otros cambios que no están reflejados en esta guía; si aún tienes problemas al actualizar tu aplicación te recomendamos revisar la guía oficial. para conocer en detalle todos los cambios.

Adicionalmente, te recomendamos que veas los cambios en el repositorio laravel/laravel de GitHub. Si bien muchos de estos cambios no son necesarios, es posible que desees mantener estos archivos sincronizados con tu aplicación. Puedes ver fácilmente los cambios con la herramienta de comparación GitHub y elegir qué actualizaciones son importantes para ti.

¡Bien! con esto hemos terminado la actualización de un proyecto a Laravel 5.8. ¡No dejes de hacerla! para que tu proyecto se mantenga con versiones vigentes del framework y los componentes que usas.

Material relacionado

Suscríbete a nuestro boletín

Te enviaremos publicaciones con consejos útiles y múltiples recursos para que sigas aprendiendo.

Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.