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
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
- Cómo actualizar a Laravel 5.3 desde 5.2
- Componentes y slots en Laravel 5.4
- Facades automáticos en Laravel 5.4
- Generar controladores de tipo recurso asociados a un modelo en Laravel 5.4
Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.