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:
- Actualizando la aplicación de Laravel 5.4 a Laravel 5.5
- Actualiza un proyecto real de Laravel 5.3 a 5.4 en 20 minutos y en versión texto Cómo actualizar una aplicación de Laravel 5.3 a Laravel 5.4
- Cómo actualizar a Laravel 5.3 desde 5.2
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:
- Curso de Novedades de Laravel 5.5
- Curso de novedades de Laravel 5.4
- Curso de novedades en Laravel 5.3
- Curso de novedades en Laravel 5.2
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, incluyendo la siguiente línea entre las dependencias de desarrollo (require-dev
)
"nunomaduro/collision": "^2.0"
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:
public function createApplication() { $app = require __DIR__.'/../bootstrap/app.php'; $app->make(Kernel::class)->bootstrap(); Hash::driver('bcrypt')->setRounds(4); return $app; }
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;
quedando de la siguiente manera:
<?php //... /** * The headers that should be used to detect proxies. * * @var int */ protected $headers = 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:
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
Un ejemplo de su uso es:
Route::get('/my-route', function () { return view('welcome'); })->middleware('cache.headers:max_age=180;s_maxage=60;etag;immutable');
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:
public function boot() { Paginator::useBootstrapThree(); }
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í:
public function boot() { Blade::withoutDoubleEncoding(); }
No olvides importar el facade Illuminate\Support\Facades\Blade
a la clase.
Para el helper e()
Pasa false como segundo argumento:
e($string, false);
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
recibenull
devolverá un array vacío. - El método
getDateFormat
de Eloquent ahora espublic
en vez deprotected
. - 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/traitValidatesWhenResolved
ha sido renombrado avalidateResolved()
para evitar confusiones con el método$request->validate()
. - La clase
Illuminate\Log\Writer
ha sido renombrada aIlluminate\Log\Logger
, si has usado directamente esta clase debes cambiarla o alternativamente usar la interfaz estandarizadaPsr\Log\LoggerInterface
- La interfaz
Illuminate\Contracts\Logging\Log
fue eliminada y debes sustituirla porPsr\Log\LoggerInterface
. - Debes eliminar el argumento
$decayMinutes
(en desuso) del métodoRateLimiter::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étodogetMigrationsBatches
.
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
- ¡Laravel 5.6 ya está disponible!
- Cómo actualizar tu proyecto de Laravel 5.6 a Laravel 5.7
- Laracon Online: Lanzamiento de Laravel 5.6 por Taylor Otwell
Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.