Comparte en Facebook Twitter Google+

Laravel 5.6 ya está disponible

Con la salida de Laravel 5.6 no solo vamos a estudiar las novedades sino también realizar una parte importante del desarrollo de aplicaciones que a veces descuidamos: el mantenimiento de las aplicaciones que tenemos activas y aún en desarrollo. Para sacar el mayor provecho de las mejoras, que si bien es cierto son pocas frente a versiones anteriores, es necesario mantener nuestras aplicaciones actualizadas.

Los pasos descritos a continuación son para actualizar de Laravel 5.5 a 5.6, si necesitas actualizar tu aplicación de Laravel que está en una versión anterior a la 5.5 debes primero actualizar versión por versión desde la que te encuentres hasta llegar a la versión 5.6. Puedes guiarte utilizando nuestros tutoriales:

También puedes revisar la documentación oficial de cada versión en la sección Upgrade Guide.

En caso de que tu aplicación esté varias versiones atrasada y deseas actualizar, puedes también  crear un proyecto en Laravel 5.6 e ir agregando el código de tu aplicación.  Sin embargo, puedes encontrar que algunos métodos o clases ya no existen o fueron cambiados. Te recomendamos nuestros cursos de novedades para que puedas indagar lo que ha cambiado a partir de la versión de Laravel en la que se encuentre tu aplicación además de las mejoras incluidas en cada versión:

Ahora sí, comencemos con la actualización:

Paso 1: Preparar el entorno

Para actualizar a Laravel 5.6 es necesario tener instalado PHP 7.1.3 o superior, por tanto, es una restricción a tomar en cuenta, pues debes asegurarte que tanto el entorno de desarrollo como el entorno de producción cumplan con este requisito.

Si tienes pruebas escritas que soporten tu proyecto es momento de ejecutarlas para confirmar que antes de la actualización la aplicación está funcionando correctamente.

Paso 2: Actualización de dependencias

Debes actualizar el contenido del archivo composer.json de tu aplicación para que sea similar al del repositorio de Laravel en Github. En este caso debes actualizar las siguientes dependencias:

  • PHP: "php": ">=7.1.3",
  • Laravel:  "laravel/framework": "5.6.*",
  • Proxy:  "fideloper/proxy": "~4.0",
  • PHPUnit: "phpunit/phpunit": "~7.0"

Además, puedes agregar Collision, un paquete incluido por defecto ahora en Laravel 5.6 para el manejo de errores en la línea de comandos. Puedes instalarlo ejecutando en la terminal:

composer require nunomaduro/collision --dev

Otras dependencias

Para Laravel 5.6 si estás usando algunas de las siguientes dependencias es necesario que se actualicen a las siguientes versiones:

  • Laravel Dusk ~3.0
  • Passport ~5.0
  • Scout ~4.0

Adicionalmente, debes revisar uno a uno los repositorios de las dependencias que has añadido a tu aplicación para conocer cómo actualizarlas adecuadamente. Para ello debes dirigirte al repositorio de cada componente y verificar que tiene soporte para Laravel 5.6 o PHP 7.1.3 o superior.

Comando optimize de Artisan

El comando optimize fue eliminado del framework ya que la función que cumplía ha sido cubierta con las recientes mejoras en PHP, incluido el OPcache. Por tanto debes eliminar php artisan optimize de los scripts del archivo composer.json.

Luego de modificar por completo el archivo composer.json ejecutamos composer update.

Este es un buen momento para volver a ejecutar las pruebas para verificar si alguna está fallando.

Paso 3: Agregar los nuevos archivos de configuración

Hay dos nuevos archivos en el directorio config que debes agregar y puedes copiar directamente del repositorio del framework:

Logging

Puedes adaptarlo a las necesidades de tu proyecto, escogiendo cuál canal estará por defecto en la opción default.  Adicionalmente debes eliminar las opciones log y level_log del archivo config/app.php y agregar las variables LOG_CHANNEL=stack y LOG_SLACK_WEBHOOK_URL= (en caso de querer usar Slack para notificar logs) en el archivo .env y .env.example para facilitar el cambio de configuración de un entorno a otro (producción, local, testing, etc) y eliminar la variable APP_LOG_LEVEL=debug que ya no es usada.

Hashing

Tienes la opción de cambiar de bcrypt a argon como driver por defecto, si lo deseas. Además si estás usando el componente de pruebas debes actualizar el archivo tests/CreatesApplication.php para agregar en el método createApplication antes del return el siguiente código:  Hash::driver('bcrypt')->setRounds(4); sin olvidar importar el facade a la clase. Debe quedar de esta manera:

Paso 4: Actualización de Middleware

Trusted Proxies

Debido a cambios subyacentes en la funcionalidad de proxy de confianza de HttpFoundation de Symfony, se deben hacer ligeros cambios en el middleware App\Http\Middleware\TrustProxies.  En la variable $request se debe sustituir el valor de la propiedad $headers del array que tenía en Laravel 5.5 a la constante Request::HEADER_X_FORWARDED_ALL;.

SetCacheHeaders

Este es un nuevo middleware que podemos agregar en nuestra aplicación que permite establecer fácilmente encabezados de cache HTTP a través de un middleware de ruta. Por tanto si deseas usarlo debes editar el archivo app/Http/Kernel.php y agregar en el array $routeMiddleware lo siguiente:

Un ejemplo de su uso es:

Paso 5: Versión de Bootstrap en la Paginación

Debido a que Laravel 5.6 viene por defecto con Bootstrap 4 tanto los enlaces de la paginación, así como las plantillas y vistas que vienen por defecto en el framework funcionarán con la nueva versión de este framework de CSS. Si deseas mantener Bootstrap 3 como la versión de tu proyecto para la paginación (versión por defecto de las anteriores versiones de Laravel) debes agregar en el método boot del service provider AppServiceProvider de tu proyecto el método Paginator::useBootstrapThree de esta manera:

No olvides importar la clase Illuminate\Pagination\Paginator al service provider.

Paso 6: Codificación de entidades de HTML

En versiones anteriores de Laravel, tanto Blade como el helper e no convertían caracteres especiales en entidades HTML. Este no era el comportamiento por defecto de la función de PHP htmlspecialchars subyacente y podía dar lugar a un comportamiento inesperado al mostrar contenido o al pasar contenido JSON en línea a un framework de JavaScript (como Vue.js).

Pero ahora para Laravel 5.6, Blade y el helper e convertirán caracteres especiales en entidades HTML por defecto para alinearlo con el comportamiento por defecto de la funcion de PHP htmlspecialchars. Por lo tanto, si quieres mantener el comportamiento previo de prevenir la conversión de las entidades debes hacer lo siguiente:

Para Blade

Si quisieras desactivar el nuevo feature de double encoding debes agregar el método Blade::withoutDoubleEncoding al método boot del service provider AppServiceProvider, así:

No olvides importar el facade a la clase.

Para el helper e()

Pasa false como segundo argumento:

Paso 7: Retorno de código de estatus 201 cuando se crea un nuevo modelo

Al devolver un modelo Eloquent recién creado directamente desde una ruta, el estado de la respuesta ahora se establecerá automáticamente en 201 en lugar de 200. Si alguna de tus pruebas espera explícitamente una respuesta 200, esas pruebas deberán actualizarse para esperar 201.

Otros cambios

  • Si el método Arr::wrap recibe null devolverá un array vacío.
  • El método getDateFormat de Eloquent ahora es public en vez de protected.
  • La propiedad original de las respuestas de API Resource ahora es establecido con el modelo original en vez de un JSON o array para facilitar la inspección de los modelos durante las pruebas.

Pasos adicionales:

Si en tu aplicación no has aplicado personalizaciones a las clases del framework los pasos anteriores son los principales que debes aplicar para tener tu aplicación en Laravel 5.6.

Sin embargo, para quienes sí lo hayan hecho, algunos cambios que deben tomar en cuenta son:

  • Si estás interactuando directamente con los componentes de Symfony usados por Laravel en tu aplicación debes saber que fueron actualizados a la serie ~4.0 por tanto debes revisar el historial de cambios de los componentes usados para evitar problemas.
  • El método validate() de la interfaz/trait ValidatesWhenResolved  ha sido renombrado a validateResolved() para evitar confusiones con el método $request->validate().
  • La clase Illuminate\Log\Writer ha sido renombrada a Illuminate\Log\Logger, si has usado directamente esta clase debes cambiarla o alternativamente usar la interfaz estandarizada Psr\Log\LoggerInterface
  • La interfaz Illuminate\Contracts\Logging\Log fue eliminada y debes sustituirla por Psr\Log\LoggerInterface.
  • Debes eliminar el argumento $decayMinutes (en desuso) del método RateLimiter::tooManyAttempts() si estás implementando una personalización de dicho método.
  • Si tienes una personalización propia para la clase MigrationRepositoryInterface debes agregar el método getMigrationsBatches.

Para mayor información sobre estos cambios y algunos otros no mencionados te recomendamos revisar el archivo changelog del framework  y así confirmar que todo funciona correctamente. De igual forma puedes revisar los cambios hechos en el repositorio del proyecto.

También puedes ver nuestro Videotutorial: actualicemos un proyecto de Laravel 5.5 a la versión 5.6 donde actualizamos el proyecto creado durante el Curso de Laravel 5.5 desde cero.

Material relacionado

Suscríbete a nuestro boletín

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

Aprovecha nuestra promoción activa y únete a Styde por menos de 10 USD al mes: ver planes semestral y anual.