Como desarrolladores nuestro trabajo no es solo crear aplicaciones que funcionen sino también darles el soporte para que puedan mantenerse a lo largo de su vida útil. En el caso de Laravel las actualizaciones mayores que traen nuevas funcionalidades, mejoras y correcciones se realiza cada 6 meses. Sin embargo, actualizar un proyecto desarrollado en Laravel de una versión a otra no es tan complicado como parece. En este artículo te contaremos cuáles son los cambios más importantes y los pasos para actualizar tu aplicación de la versión 5.8 a la 6.0 de Laravel. Sobre todo sabiendo que será una versión LTS, es decir tendrá soporte para correcciones de problemas de seguridad hasta septiembre de 2022.

Requisitos

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

  • La versión de la aplicación a actualizar es Laravel 5.8. En caso contrario, debes actualizarla a esa versión. En Styde tenemos guías para actualizar desde anteriores versiones. Toma en cuenta que no existe Laravel 5.9 debido a los cambios hechos al versionado del framework.
  • El servidor de producción y demás ambientes deben tener PHP 7.2 o superior, pues es el nuevo requisito mínimo de Laravel 6.0, esto debido a que PHP 7.1 tendrá soporte activo hasta diciembre de 2019.
  • Confirmar que cada uno de los paquetes de terceros usados en la aplicación pueden trabajar con Laravel 6.0. Para ello debes revisar sus páginas o repositorios oficiales.

Es recomendable esperar algo de tiempo para que los desarrolladores de paquetes de terceros actualicen sus respectivos paquetes.

Recomendación

Usa Git para evitar problemas si algo falla y que no puedas solventar, te recomendamos crear una nueva rama para realizar la actualización de esa manera el código de tu proyecto funcionando estará respaldado.

Pasos de actualización

Paso 1. Comprobar funcionamiento de la aplicación

Antes de iniciar el proceso de actualización es imprescindible que compruebes que tu aplicación esté funcionando correctamente. Si has escrito pruebas automatizadas es momento de ejecutarlas, de lo contrario, haz pruebas manuales a tu aplicación para verificar todos los módulos.

Paso 2. Actualiza dependencias

Para ello, en el archivo composer.json actualiza las dependencias del framework a ^6.0, esto cambiando a:

"laravel/framework": "^6.0"

Además, actualiza el requisito mínimo a PHP 7.2 de esta manera:

"php": "^7.2",

También actualiza el paquete de desarrollo phpunit/phpunit así:

"phpunit/phpunit": "^8.0"

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

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

Si tienes pruebas en tu aplicación puedes ejecutarlas nuevamente para verificar que todo siga funcionando correctamente.

Paso 3. Realiza los cambios adicionales a tu aplicación

Hay una serie de cambios adicionales que debes tomar en cuenta cuando actualizas tu aplicación. No todos aplicarán a tu proyecto, pues depende de las funcionalidades del framework que hayas usado:

Helpers de String y Array

En la actualización a Laravel 5.8 quedó en desuso los helpers para String y Array, ahora para Laravel 6.0 estos helpers fueron eliminados del framework. Si aún los usas en tu proyecto debes elegir entre estas dos opciones:

  • Cambiar los helpers por llamados a los métodos de las clases Illuminate\Support\Str y Illuminate\Support\Arr .
  • Instalar el nuevo paquete laravel/helpers a tu aplicación para continuar usando estos helpers:
    composer require laravel/helpers

Carbon 1.x ya no está soportado

Si tu proyecto fue creado en una versión anterior de Laravel como 5.7 o 5.6 y has venido actualizando hasta Laravel 5.8 debes comprobar en tu archivo composer.json cuál versión de Carbon estás usando. Si es 1.x debes actualizarlo a 2.0 puesto que esta versión ya no está siendo mantenida.

Aprende más sobre Carbon 2 en 8 características de Carbon 2.0 que debes conocer

Recursos autorizados y el nuevo método viewAny

¿Usas el método authorizeResource para asignar políticas de acceso a los métodos de tus controladores? Entonces debes definir un nuevo método viewAny en la clase de la política para configurar qué usuarios tendrán acceso al método index de tu controlador. Como por ejemplo:

/**
 * Determine whether the user can view any posts.
 *
 * @param  \App\User  $user
 * @return mixed
 */
public function viewAny(User $user)
{
    return true;
}

De lo contrario, las llamadas al método index del controlador serán rechazadas como no autorizadas.

Método BelongsTo::update de Eloquent

Para mantener consistencia con los métodos update de todos los demás tipos de relaciones, el método update de la relación BelongsTo ahora funciona como una consulta de actualización ad-hoc, es decir que no proporciona protección de asignación masiva ni dispara eventos de Eloquent.

Si deseas actualizar un modelo asociado a través de una relación BelongsTo y esperas recibir 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']);

Nota la diferencia entre user() y user (sin paréntesis). Si te confunde el uso de paréntesis o no en las relaciones, te recomendamos revisar la lección Colecciones con Fluent, el constructor de consultas SQL de Laravel donde abordamos éste y otros temas.

Tipos de clave primaria en Eloquent

Si alguno de tus modelos usa como clave primaria un campo de tipo cadena o string debes declarar en dicho modelo el tipo de clave utilizando la propiedad $keyType:

/**
* The "type" of the primary key ID.
*
* @var string
*/
protected $keyType = 'string';

Esto debido a que las claves de tipo entero han recibido mejoras de rendimiento que no están relacionadas con las claves primarias de tipo cadena.

Ruta de verificación de correo electrónico

¿Estás usando la funcionalidad de Laravel para verificar el correo electrónico de los usuarios que se registran en tu aplicación? Entonces para evitar posibles ataques de CSRF se ha cambiado el método de la ruta ruta email/resend de GET a POST.

Por tanto, en el frontend de tu proyecto, que por defecto en Laravel está en la vista auth/verify.blade.php, debes cambiar de:

<a href="{{ route('verification.resend') }}">
    Clic aquí para solicitar otro correo de verificación
</a>

a:

 <form class="d-inline" method="POST" action="{{ route('verification.resend') }}">
    @csrf
    
    <button type="submit" class="btn btn-link">
        Clic aquí para solicitar otro correo de verificación
    </button>.
</form>

Métodos de configuración regional Lang::trans y Lang::transChoice

Si tu aplicación es multidioma es posible que uses los métodos Lang::trans y Lang::transChoice para traducir los textos al idioma seleccionado. Si es tu caso, entonces debes cambiar sus nombres por Lang::get y Lang::choice respectivamente. De igual forma si usas el método Lang::getFromJson debes actualizar para llamar a Lang::get, puesto que en Laravel 6.0 se ha integrado dicha funcionalidad en un solo método.

Los nombre de los helpers para estos métodos se mantienen como trans y trans_choice

Facade Input

Se ha eliminado la facade Input que era principalmente un duplicado de la facade Request . 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.

Generación de rutas con parámetros adicionales

Cuando pasamos un arreglo asociativo al helper route en Laravel 5.8 o inferior, los valores en dicho arreglo pueden ser usados por el framework para completar los parámetros de la URL aunque sus llaves no coincidan con las llaves esperadas, por ejemplo, teniendo la siguiente ruta:

<?php

Route::get('/news/{language?}', 'NewsController@index')->name('news.index');

Llamar al helper route de esta forma en Laravel 5.8:

<?php

echo route('news.index', ['idioma' => 'es']);

Imprime el siguiente resultado: /news/es. Nota que he utilizado la llave incorrecta a propósito (idioma en vez de language).

Pero en Laravel 6.0 la llave debe coincidir, de lo contrario el parámetro extra se usará como parte del «query string», es decir el ejemplo anterior imprime /news?idioma=es en Laravel 6.0.

Para obtener el resultado anterior debemos llamar a la ruta con los parámetros correctos, es decir:

<?php

echo route('news.index', ['language' => 'es']);

Imprimirá /news/es tanto en Laravel 5.8 como en Laravel 6.0 y superior.

Controlador RegisterController

¿Has personalizado el registro de usuarios de tu aplicación sobreescribiendo los métodos register o registered del framework? Asegúrate que el inicio de sesión del usuario y/o la llamada a los eventos que correspondan sigan funcionando correctamente.

Arrayable y toArray de Eloquent

El método toArray del modelo Eloquent ahora convertirá cualquier atributo que implemente Illuminate\Contracts\Support\Arrayable a un arreglo.

Hay muchos otros cambios que no están reflejados en esta guía como por ejemplo cuando se agregan nuevos métodos a las interfaces del framework y debes agregarlas a tus implementaciones personalizadas. Es por ello que te recomendamos revisar la guía oficial para mayores detalles.

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.

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.