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
- ¡Laravel 5.8 ya está disponible!
- Cómo actualizar tu proyecto de Laravel 5.6 a Laravel 5.7
- Roles y Permisos con Laravel 5.8 y Bouncer
- Videotutorial: actualiza una aplicación a Laravel 5.8
Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.