En este video trabajaré en la actualización de la aplicación del curso Crea un Panel de Control con Laravel a la versión 6.0 LTS del framework Laravel.

Repositorio

Ver el código de esta lección en GitHub

Material Relacionado

Suscríbete a nuestro boletín

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

Versión en Texto

Ya es casi una tradición que cada 6 meses Clemir nos brinde un post sobre cómo actualizar una aplicación de Laravel de la versión anterior a la actual, y revisando la guía este año sobre Cómo actualizar tu aplicación de Laravel 5.8 a 6.0 podemos ver una vez más los siguientes consejos:

  • Prueba todo tu proyecto antes de actualizar para verificar que funcione y
  • Comienza el proceso de actualización en una rama nueva de git

Comencemos con estos dos pasos. La última rama de este proyecto es filters_refactor, así que ve a ella con git checkout filters_refactor

A continuación ejecutas las pruebas con vendor/bin/phpunit (si usas Windows posiblemente debas invertir las barras diagonal a vendor\bin\phpunit) o si tienes un alias como t puedes usarlo.

También realiza un par de pruebas en el navegador antes de comenzar la actualización.

Si encuentras algún error corrígelo antes de continuar, de lo contrario crea una nueva rama con git checkout -b upgrade_laravel_6.

Actualizando las dependencias con Composer

Ahora verifica los cambios que se han hecho al proyecto base de Laravel entre ambas versiones visitando la URL: https://github.com/laravel/laravel/compare/5.8…master y agrega aquellos que sean relevantes para ti. El más importante de estos cambios es, por supuesto, el archivo  composer.json donde están las nuevas dependencias, procede a actualizarlo en tu proyecto:

  • Cambia la dependencia de PHP de "^7.1.3" por "^7.2"
  • Cambia laravel/framework de "5.8.*" a "^6.0"
  • Elimina "filp/whoops": "^2.0" y agrega "facade/ignition": "^1.4" en el bloque require-dev
  • Actualiza phpunit/phpunit de "^7.5" a "^8.0"

Luego hace falta investigar los paquetes de terceros que hemos instalado y actualizarlos a sus versiones más recientes. Ya he realizado este paso tedioso por ti y me di cuenta que no hay que hacer ningún cambio, salvo eliminar "beyondcode/laravel-query-detector": "^1.0" que al momento de preparar esta lección no tiene soporte para Laravel 6.0. Es posible que esté disponible más adelante; pero por ahora remuévelo para continuar el proceso.

Ahora ejecuta composer update y espera mientras se completa la actualización.

Corrigiendo los errores relacionados con el uso de los helpers de String y Array

Ahora podemos ver que «casi» toda la actualización ha tenido éxito. En realidad nos encontramos con el molesto error de que estamos llamando a la función no definida str_slug. Esta y otras funciones de string y array (str_ y arr_) han sido eliminadas del framework. Tenemos 2 opciones, podemos instalar laravel/helpers o reemplazar su uso por los facades Str:: y Arr::.

Comienza instalando Laravel Helpers con composer require laravel/helpers

Ahora vuelve a ejecutar las pruebas. Si una o más pruebas fallan por un error como: Method Illuminate\Translation\Translator::getFromJson does not exist

Eecuta el comando php artisan view:clear para limpiar las vistas en caché y vuelve a ejecutar las pruebas.

¡Todas las pruebas están pasando! Pero antes de que vayamos a festejar, busca los lugares donde se usen los helpers str_ y arr_ Por ejemplo:

Puesto que no son muchos vale la pena abrirlos uno por uno, comienza por TestHelpers. Cambia str_plural por Str::plural en ambas ocurrencias. ¡No olvides importar Illuminate\Support\Str!

Re-ejecuta las pruebas, si están pasando continua reemplazando str_slug por Str::slug en config/session.php. Aunque este archivo no tiene nombre de espacio Laravel podría usar el alias Str declarado en config/app.php. Pero al parecer este archivo se lee antes de que el alias Str sea asignado, por lo tanto vuelve a importar Illuminate\Support\Str al principio del archivo. Si estás actualizando tu proyecto y no la aplicación del curso, sigue haciendo estos cambios hasta que estés listo. Re-ejecuta las pruebas. Si las pruebas pasan entonces ejecuta composer remove laravel/helpers en la consola para eliminar el paquete de helpers y vuelve a re-ejecutar las pruebas.

Si no pasan por un error de que una función con el prefijo str_ o arr_ no existe, vuelve a instalar laravel/helpers y a repetir los pasos anteriores.

Faker y problemas con seeders y pruebas

Un problema menor que puede causar que tus pruebas o seeders estén fallando es cuando éstas dependen de valores generados de forma aleatoria generados por Faker. Por ejemplo si ejecutas php artisan db:seed varias veces deberías ver un error como éste:

  Illuminate\Database\QueryException : SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'Haag Group' for key 'teams_name_unique' (SQL: insert into `teams` (`name`, `updated_at`, `created_at`) values (Haag Group, 2019-09-04 15:45:46, 2019-09-04 15:45:46))

La solución es muy simple, dirígete al archivo database/factories/TeamFactory.php y agrega el llamado al método ->unique() antes de ->company para que se generen valores únicos. De esta forma evitaremos una posible violación de la integridad de la base de datos que definimos previamente, la cual requiere que los nombres de las empresas o equipos sean únicos dentro de la tabla teams.

Las pruebas también pueden fallar si Faker genera un dato aleatorio que coincida con un valor esperado o no esperado. Por ejemplo ve a tests/Feature/Admin/SearchUsersTest y agrega el email [email protected] al usuario $ellie:

<?php

$ellie = factory(User::class)->create([
    'name' => 'Ellie',
    'email' => '[email protected]',
]);

Si ejecutas las pruebas ahora las verás fallar, puesto que la búsqueda también usa el campo email. Por lo tanto es mejor no depender de datos aleatorios si estos pueden afectar el resultado de la prueba. Define los correos de forma explícita [email protected] y [email protected]. Re-ejecuta las pruebas.

Para finalizar revisa el módulo de usuarios y los otros módulos que desarrollamos desde el navegador, en mi caso la URL es http://www.curso-styde.local/usuarios. Si todo parece estar bien ahora sí es momento de celebrar.

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

Lección anterior Refactorización para reducir duplicación en los controladores de Laravel Lección siguiente Selección con subconsultas de SQL en Eloquent ORM a partir de Laravel 6, parte 1