Laravel 6.0 : qu’est ce que propose cette nouvelle version LTS majeure ?

Laravel 6.0 : qu’est ce que propose cette nouvelle version LTS majeure ?

29 août 2019 2 Par Aldew
(Article mis à jour le 29 septembre 2019)

Laravel 6.0 : le sommaire

Laravel 6.0 déjà ?

Laravel 6.0 ? A l’heure où j’écris ces lignes, cette nouvelle version sortira dans cinq jours officiellement. Mais Laravel 6.0 est bien sorti comme prévu le 3 septembre 2019 et vous pouvez déjà l’installer en lançant un nouveau projet avec la commande suivante :

laravel new my-project

Il n’y aura pas de version 5.9, la dernière version de la branche 5 est la 5.8.

Politique de support

Laravel 6.0 sera la nouvelle version LTS du framework PHP et mettra un terme au support longue durée de la version 5.5 (la dernière LTS). Cette dernière ayant fournie de bons et loyaux services à la communauté des développeurs Laravel depuis Juillet 2017.

Elle disposera tout de même des corrections de sécurité jusqu’au 30 août 2020.

Vous avez encore un peu de temps devant vous pour préparer une migration en bonne et due forme !

Tableau des releases de Laravel depuis la version 5.5 jusqu'à Laravel 6
Tableau des releases de Laravel depuis la version 5.5 jusqu’à Laravel 6.0

La documentation officielle de la nouvelle version 6 est déjà disponible en ligne depuis le 29 août 2019.

On ne plaisante pas avec la documentation chez Laravel !!

RTFM !

Cette nouvelle LTS sera supportée jusqu’au 3 septembre 2022. Vous aurez le temps de voir venir 😀

Comme toutes les LTS, les corrections de bugs interviendront pendant 2 années à compter du 3 septembre 2019. Elle bénéficiera également d’un an supplémentaire de correction de sécurité.

En ce qui concerne les versions intermédiaires (5.6, 5.7, 5.8, 6.1, etc.), le cycle est plus court :

  • correction de bugs pendant 6 mois
  • correction de sécurité pendant 1 an

Système de versions

Laravel 6.0 ainsi que l’ensemble de ses composants propriétaires se conforment à la gestion sémantique de version :

Laravel 6 supporte la gestion sémentique de version
Synthèse de la gestion sémentique de version (2.0.0)

Traduit dans le texte, cela signifie notamment que les versions MINEURES et CORRECTIVES ne cassent jamais la chaîne de retrocompatibilité.

Par contre, les versions majeures (comme Laravel 6.0) peuvent embarquer des changement important. Toutefois, comme cela est indiqué dans le documentation, l’équipe Laravel s’engage à ce que ces changements ne prennent pas plus d’une journée à être intégrés dans vos développements.

Laravel 6.0 : les nouveautés

Les nouveautés en résumé

Il faut savoir que cette nouvelle version de Laravel s’inscrit dans la continuité des changements apportés par Laravel 5.8.

En résumé, elle propose l’introduction de la gestion sémantique des versions, la compatibilité avec Laravel Vapor, améliore les réponses aux demandes d’autorisation d’accès, le job middleware, des optimisations pour les bases de données comme les lazy collections et l’amélioration des sous-requêtes, l’extraction des générateurs frontend vers un package Composer nommé laravel/ui et bien évidemment toute une liste de correction de bugs et d’améliorations diverses.

Gestion sémantique des versions

Comme nous avons déjà parlé plus haut, à partir de cette version le package Laravel suivra les préconisations sur la gestion des versions. Cela mettra Laravel en conformité avec les autres packages Laravel qui appliquent déjà ce système de gestion des versions.

Cela n’aura aucun impact sur le cycle de sortie des versions de Laravel.

Laravel 6.0 introduit la compatibilité avec Laravel Vapor

Laravel 6.0 est compatible avec Laravel Vapor, la plate-forme conçue par Taylor Otwell déploiement sans serveur à mise à l’échelle automatique pour Laravel. Il s’agit d’une plateforme payante permettant de grandement simplifier le déploiement d’application Laravel en bénéficiant de fonctionnalités poussées selon son auteur.

Il faut savoir que c’est tout de même 399$ / an sans intégrer les coûts d’AWS Cloud. Toutefois je n’apporte pas de jugement, il faut essayer. D’ailleurs, à l’attention de Taylor Otwell (qui, soyons réaliste, ne lira probablement jamais cet article), ce serait bien de pouvoir essayer pour décider 😉 !

Réponses d’autorisation améliorées (Improved Authorization Responses)

Dans les versions précédentes de Laravel, il n’était pas aisé de récupérer et de présenter des messages d’autorisation personnalisés aux utilisateurs finaux. Il était donc difficile d’expliquer à ces derniers pourquoi une demande particulière avait été refusée.

Avec Laravel 6.0, c’est beaucoup plus simple avec les messages de réponse d’autorisation et la nouvelle méthode Gate :: inspect. Par exemple, avec la méthode de stratégie suivante :

/**
 * Determine if the user can view the given flight.
 *
 * @param  \App\User  $user
 * @param  \App\Flight  $flight
 * @return mixed
 */
public function view(User $user, Flight $flight)
{
    return $this->deny('Explanation of denial.');
}

La réponse de la politique d’autorisation et le message associé sont récupérables très facilement en utilisant la méthode Gate::Inspect :

$response = Gate::inspect('view', $flight);

if ($response->allowed()) {
    // User is authorized to view the flight...
}

if ($response->denied()) {
    echo $response->message();
}

De plus, ces messages personnalisés pourront être envoyés directement vers votre frontend si vous utilisez les helpers tels que $this->authorize ou Gate::authorize à partir de vos routes ou de vos controllers.

Introduction au Job Middleware

Le job middleware vous permet d’encapsuler une logique personnalisée autour de l’exécution des travaux en file d’attente, ce qui réduit le code passe-partout dans les jobs eux-mêmes.

Par exemple, vous avez peut-être déjà codé ceci pour une méthode job handle avec un taux de callback limité :

/**
 * Execute the job.
 *
 * @return void
 */
public function handle()
{
    Redis::throttle('key')->block(0)->allow(1)->every(5)->then(function () {
        info('Lock obtained...');

        // Handle job...
    }, function () {
        // Could not obtain lock...

        return $this->release(5);
    });
}

Avec Laravel 6.0, l’ensemble de cette logique peut-être placé dans un job middleware.

Cela va vous permettre de garder la méthode handle propre et sans qu’elle ait à gérer les limitations d’appels.

<?php

namespace App\Jobs\Middleware;

use Illuminate\Support\Facades\Redis;

class RateLimited
{
    /**
     * Process the queued job.
     *
     * @param  mixed  $job
     * @param  callable  $next
     * @return mixed
     */
    public function handle($job, $next)
    {
        Redis::throttle('key')
                ->block(0)->allow(1)->every(5)
                ->then(function () use ($job, $next) {
                    // Lock obtained...

                    $next($job);
                }, function () use ($job) {
                    // Could not obtain lock...

                    $job->release(5);
                });
    }
}

Après avoir créé le middleware, on peut le rattacher à un job très facilement en le retournant depuis la méthode middleware du job :

use App\Jobs\Middleware\RateLimited;

/**
 * Get the middleware the job should pass through.
 *
 * @return array
 */
public function middleware()
{
    return [new RateLimited];
}

Soutenez moi !

Ecrire ces articles est passionnant, mais cela prends du temps 😉 Je souhaite y consacrer plus de temps et votre soutien est capital pour cela.

Si vous souhaitez m’encourager, cliquez sur le bouton ci-dessous et donnez ce que vous voulez !

Et maintenant la suite de cet article. Bonne journée !

Buy me a coffeeBuy me a coffee

Les lazy collections

Autrement dit les collections fainéantes 😀 !

Plus sérieusement, qu’est ce que cela veut dire ?

Tout simplement, que vous allez pouvoir utiliser dans les collections les générators de php ce qui vous permettra de travailler avec des jeux de données très importants en impactant le moins possible l’utilisation de la mémoire.

Laravel 6.0 introduit une LazyCollection, qui exploite les générateurs de PHP pour vous permettre de travailler avec de très grands ensembles de données tout en limitant l’utilisation de la mémoire.

Ce concept peut être utilisé par exemple lors du parsing de fichiers de logs de plusieurs dizaines, voire centaines de Mo ou encore lors de l’utilisation d’un très grands nombres de models. Sans les lazy collections tous les modèles doivent être chargés en mémoire ce qui aura un impact très négatif sur votre application.

Amélioration des sous-requêtes dans Eloquent (Eloquent Subquery Enhancements)

Les sous-requêtes existent depuis un petit moment déjà. Laravel 6.0 va un petit cran plus loin en leur apportant plusieurs améliorations.

Par exemple, imaginons que vous avez une table avec les destinations (destinations) de vols et une table des vols (flights).

La table flights a une colonne arrived_at qui indique quand le vol est arrivé à destination.

En utilisant la nouvelle fonctionnalité select des sous-requêtes de Laravel 6.0, il est possible de sélectionner toutes la destination et le nom du vol qui est arrivé le plus récemment à destination en une seule requête :

return Destination::addSelect(['last_flight' => Flight::select('name')
    ->whereColumn('destination_id', 'destinations.id')
    ->orderBy('arrived_at', 'desc')
    ->limit(1)
])->get();

De plus, on peut utiliser les nouvelles fonctionnalité de sous-requête ajoutées à la fonction orderBy du query builder pour trier toutes les destinations sur la base du dernier vol arrivé à cette destination. Encore une fois, cela peut être effectué à l’aide d’une seule et unique requête :

return Destination::orderByDesc(
    Flight::select('arrived_at')
        ->whereColumn('destination_id', 'destinations.id')
        ->orderBy('arrived_at', 'desc')
        ->limit(1)
)->get();

Laravel UI

Le constructeur d’interface fourni dans les versions précédentes de Laravel a été extrait et placé dans un package Composer laravel/ui.

Cela permet à cette partie d’être développée et versionnée séparemment du reste du framework. La conséquence à ce changement est qu’il n’y a plus de code Vue ou Bootstrap par défaut dans le framework.

La commande make:auth a également été extraite du framework.

Afin de restaurer la partie frontend à base de Vue / Bootstrap des précédentes versions de Laravel, vous devrez installer le package laravel/ui et utiliser la command Artisan ui pour installer cette partie du frontend :

composer require laravel/ui

php artisan ui vue --auth

Upgrade de Laravel 5.8 vers Laravel 6.0

La documentation de mise à jour vous demande de prévoir pour cette migration 1 heure, ce qui reste un impact modéré sur votre production.

Il est impératif d’utiliser à minima PHP 7.2, en effet le support de PHP 7.1 se termine en décembre 2019.

Pour prendre connaissance de tous les impacts possible dûs à cette nouvelle version , je vous invite à lire attentivement la documentation de migration. Prenez le temps de bien prendre en considération tous les aspects et de bien tester sur votre plateforme de développement afin de maîtriser les impacts potentiels !

Conclusion sur Laravel 6.0

Cette nouvelle version qui mérite d’être étudiée plus en profondeur n’apporte pas de changements révolutionnaires impliquant une migration compliquée.

Elle apporte toutefois suffisamment d’éléments intéressants pour que l’on attaque les nouveaux projets avec.

Vous pouvez d’ailleurs à ce sujet suivre le cours sur Laravel de bestmomo qui a été mis à jour pour l’occasion. Si vous préférez la lecture, je vous recommande son livre sur Laravel :

La partie sur l’optimisation des requêtes semble très intéressante, tout comme celle sur les lazy collections.

Et vous que pensez vous de cette nouvelle version de Laravel ? N’hésitez pas à nous le dire dans les commentaires.

Note de l’auteur : cet article est fortement inspiré de la release note de Laravel 6.0. Il en traduit parfois certains passages.

Que vous ayez aimé ou pas cet article, laissez nous un commentaire ci-après 😉

Aidez nous à nous améliorer en évaluant cet article :
[Total: 2 Moyenne: 5]