Para aprovechar las nuevas funcionalidades y mejoras que trae Laravel 5.4 en los proyectos que ya tenemos activos o en desarrollo con Laravel 5.3 debemos hacer una actualización, pero no te preocupes, puesto que ésta te resultará mucho más sencilla que la que fue necesaria para actualizar de Laravel 5.2 a 5.3.  A continuación te explicaremos los pasos que deberás llevar a cabo:

Actualización de dependencias

Actualiza tu archivo composer.json para usar Laravel 5.4

"require": {
    "laravel/framework": "5.4.*",
},

Además, debes confirmar que los paquetes de terceros que usas en tu aplicación, sobretodo los específicos para Laravel, como por ejemplo Laravel Collective, estén actualizados para que sean compatibles con Laravel 5.4. Ya los paquetes oficiales Laravel Cashier, Laravel Passport, Laravel Scout y Laravel Socialite han sido actualizados para ser compatibles con Laravel 5.4.

También debes cambiar phpunit/phpunit a "~5.0".

Luego ejecuta composer update para que actualice las dependencias del proyecto.

Vaciar cache

Para evitar errores con Blade por la eliminación de Illuminate\View\Factory::getFirstLoop() deberías ejecutar php artisan view:clear que limpiará la cache de las vistas. Además podrías necesitar ejecutar php artisan route:clear para vaciar la caché de las rutas.

En caso que tu proyecto sea pequeño, probablemente estos sean los únicos pasos que deberás realizar, sin embargo, te recomiendo revisar los siguientes puntos para verificar que no estés usando algo que ha cambiado o ha sido eliminado, además de incluir nuevas configuraciones. Si tu proyecto es medianamente grande o has extendido partes del framework es necesario que confirmes punto por punto:

Tinker

La consola interactiva Tinker fue convertida en un componente externo para que se pueda desinstalar fácilmente, en caso de ser necesario. Así que para seguir usando Tinker en tu aplicación actualizada a Laravel 5.4 debes ejecutar:

composer require laravel/tinker

y luego agregar el service provider en el archivo config/app.php

Laravel\Tinker\TinkerServiceProvider::class;

Este es un paso que solo harás si estás actualizando un proyecto de Laravel 5.3, pues a pesar de que ahora es un componente externo estará por defecto al crear un proyecto de Laravel 5.4

Guzzle

Si estás usando el paquete Guzzle debes actualizarlo a la versión 6.0 o mayor para usarlo en Laravel 5.4.

Blade

En Laravel 5.4 el contenido pasado en línea a través de la directiva @section, como por ejemplo @section('title', $content) será escapado. Si no deseas que esto ocurra usa la sintaxis larga:

@section('title')
    {!! $content !!}
@stop

Mail

Para poder trabajar con Markdown, lo nuevo en el componente Mail en Laravel 5.4, debes agregar al final del archivo de configuración config/mail.php lo siguiente:

'markdown' => [
    'theme' => 'default',

    'paths' => [
        resource_path('views/vendor/mail'),
    ],
],

Además, si trabajas con Mail::queue y Mail::later asegúrate que sean clases Mailables (clases que extiendan de Illuminate\Mail\Mailable) pues el uso de Closures para configurar el mensaje del mail en esos métodos ya no es soportado.

Eloquent

Cast

Ahora el cast date convertirá a la columna en un objeto Carbon pero con el tiempo 00:00:00 si deseas mantener el tiempo deberás usar el cast datetime. Como por ejemplo, para la fecha de nacimiento no interesa guardar la hora, minutos y segundos, entonces:

protected $cast = [
    'birthday' => 'date';
];

Convenciones de claves foráneas

Cuando estás definiendo una relación pero no indicas explicítamente la clave foránea, Laravel usa la convención "nombre-de-la-tabla"_"llave-primaria" del modelo relacionado, como por ejemplo user_id al tener esta relación:

public function user()
{
    return $this->belongsTo(User::class);
}

Pero ahora en Laravel 5.4 si estás sobrescribiendo el método getKeyName en un modelo que pertenece a una relación, entonces Laravel lo usará para generar la llave foránea: user_key de la relación, en vez de user_id.

Método createMany

El método createMany de una relación hasOne o hasMany ahora devuelve una instancia de Illuminate\Support\Collection en lugar de un array.

Helper factory

Llamando al helper factory de esta manera: factory(User::class, 1)->make() o factory(User::class, 1)->create() retornará una colección con un elemento. Antes retornaba una instancia del modelo directamente. Para obtener el comportamiento anterior, debes llamarlo sin indicar ninguna cantidad, por ejemplo: Ejemplo: factory(User::class)->make()

Rutas

Middleware VerifyPostSize

La clase Illuminate\Foundation\Http\Middleware\VerifyPostSize ha sido renombrada a Illuminate\Foundation\Http\Middleware\ValidatePostSize

Método middleware

El método middleware de la clase Illuminate\Routing\Router ha sido renombrado a aliasMiddleware(). Este método es poco usado en la mayoría de las aplicaciones pues lo utiliza el HTTP kernel para registrar un middleware de ruta definido en el array $routeMiddleware.

Método getParameter

El método getParameter de la clase Illuminate\Routing\Route ha sido eliminado. Deberás usar el método parameter.

Componente de pruebas

El componente de pruebas incluido con Laravel 5.3 fue separado en un paquete diferente y además fue lanzado un nuevo componente de pruebas llamado Laravel Dusk. Por tanto si en tu proyecto de Laravel 5.3 escribiste pruebas funcionales necesitarás instalar el paquete browser-kit-testing el cual te permitirá seguir ejecutando tus pruebas. Para instalarlo ejecuta:

composer require laravel/browser-kit-testing

Luego, duplica el archivo TestCase.php del directorio test colocándole como nuevo nombre BrowserKitTest.php y además debes modificarlo para que ahora la clase se llame BrowserKitTest y extienda de Laravel\BrowserKitTesting\TestCase, quedando de la siguiente manera:

<?php

use Illuminate\Contracts\Console\Kernel;
use Laravel\BrowserKitTesting\TestCase as BaseTestCase;

abstract class BrowserKitTest extends BaseTestCase
{
    /**
     * The base URL to use while testing the application.
     *
     * @var string
     */
    protected $baseUrl = 'http://localhost';

    /**
     * Creates the application.
     *
     * @return \Illuminate\Foundation\Application
     */
    public function createApplication()
    {
        $app = require __DIR__.'/../bootstrap/app.php';

        $app->make(Kernel::class)->bootstrap();

        return $app;
    }
}

Además, para que las clases de prueban la reconozcan debes modificar el archivo composer.json para agregar "tests/BrowserKitTest.php":

"autoload-dev": {
    "classmap": {
        "tests/TestCase.php",
        "tests/BrowserKitTest.php"
     }
 },

Después modifica todas tus clases de pruebas escritas en Laravel 5.3 que extendían de TestCase para que ahora extiendan de BrowserKitTest.

Aserciones

Si estás usando el método assertFired del Fake de Eventos debes cambiarlo a assertDispatched (se mantienen los parámetros iguales).

También, si estás usando el método assertSentTo del Fake de Mail debes sustituirlo por assertSent y utilizar los helpers hasTo, hasCc, etc. dentro del callback, pues el anterior método fue eliminado para simplificar el uso del fake y hacerlo similiar a los otros fake. Por ejemplo:

Mail::assertSent(MailableName::class, function ($mailable) {
    return $mailable->hasTo('[email protected]');
});

Con esto ya podrás ejecutar las pruebas que tenías en Laravel 5.3 con: vendor/bin/phpunit

Colecciones

Método every

El comportamiento del método every fue movido al método nth para que coincida con el nombre del método definido por Lodash.

Método random

El uso del método random llamando como $collection->random(1) devolverá ahora una instancia de Illuminate\Support\Collection con un elemento. Anteriormente, este método devolvía una única instancia de objeto cuando se pasaba el valor 1, ahora retornará un modelo sólo cuando se llame sin ningún argumento.

Autorización

El método Gate::getPolicyFor($class) ya no lanzará una excepción cuando no encuentra una la política sino que devolverá null. Tienes que ajustar tu código para que verifique si el resultado es null o no, en vez de la excepción.

Componente de Traducciones

El placeholder Inf usado para los mensajes de las traducciones cuando se trabaja con la pluralización y el método trans_choice fue cambiado al carácter *. Debes actualizarlo, como por ejemplo:

'users' => '{0} No hay usuarios.|{1} Hay un usuario.|[2,*] Hay :num usuarios.'

Validaciones

La regla de validación date_format ahora tendrá más precisión pues soportará los placeholder descritos en la función date de la documentación de PHP.

Si has creado una clase Validator personalizada debes cambiar el método addError por addFailure y el método doReplacements por makeReplacements.

Actualización del proyecto Laravel

Como sugerencia, también podrías revisar los cambios que se han realizado en el repositorio de Github laravel/laravel, pues a pesar que muchos cambios no son necesarios, si te puede interesar mantener actualizado, como por ejemplo: añadir los nuevos middleware, la forma en cómo se reorganizó el directorio test, la nueva sintaxis de rutas en RouteServiceProvider, entre otros.  Si quieres puedes revisar el historial de cambios directamente en Github y hacer los cambios que creas conveniente.

Otra actualizaciones

Puede que necesites revisar directamente la documentación oficial de Laravel para actualizar a Laravel 5.4 donde sedescriben otras actualizaciones que están relacionadas con Eventos: contrato, prioridad y wildcard, Bootstrappers, sobre los métodos del Container: bind, make, resolving, afterResolving y share, Broadcasting, conexiones personalizadas de bases de datos, acerca de las excepciones Illuminate\Http\Exception\HttpResponseException y Illuminate\Http\Exception\PostTooLargeException, sobre Redis, la sustitución de la interfaz SessionInterface de Symfony en sesiones, entre otras.

Garantiza que tu proyecto sigue funcionando luego de una actualización

La labor de actualizar entre versiones de Laravel suele ser sencilla y tomar tan sólo algunas horas, sin embargo luego deberías comprobar página por página y formulario por formulario que tu proyecto aún funciona y esto puede resultar bastante tedioso, es por esto y muchas otras razones que te recomendamos desarrollar proyectos con pruebas automatizadas, como te explicamos en el Curso de crea una aplicación con Laravel 5.3, el cuál estaremos actualizando a Laravel 5.4 próximamente, con este curso aprenderás a escribir pruebas unitarias, de integración y de aplicación usando PHPUnit, el componente Browser Kit Test y finalmente Laravel Dusk.

Material relacionado

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