Laravel 9 est sorti

Posté par  . Édité par vmagnin, Xavier Teyssier et Benoît Sibaud. Modéré par palm123. Licence CC By‑SA.
Étiquettes :
17
11
fév.
2022
PHP

Laravel, un framework PHP déjà évoqué dans ces colonnes, est sorti en version 9.
Découvrons ensemble les nouveautés !

Sommaire

Un an et demi après Laravel 8 et avec six mois de retard sur la date initialement prévue, dû aux changements à plusieurs reprises du calendrier des sorties, Laravel 9 est finalement sorti ce 08 février 2022.

Pour marquer le coup, l'équipe de Laravel en a profité pour rafraîchir le site officiel.

Quoi de neuf ?

Nouvelle version LTS

Première info qui a son importance : il s'agit d'une version LTS, en remplacement de la précédente (Laravel 6, qui datait de septembre 2019). Cette sortie entraîne aussi l'arrêt des correctifs d'erreurs, mais pas encore des correctifs de sécurité, pour cette dernière (cf. le calendrier officiel des versions, pour plus de détails).

Version de PHP

Le premier impact notable est la nécessité d'utiliser PHP 8.0 a minima. Ceci est notamment dû au fait que Laravel 9 repose sur des briques de Symfony 6.0 (sortie en novembre dernier) et qui nécessite, vous l'aurez compris, PHP 8.
À noter cependant qu'il faudra utiliser PHP 8.1, si vous comptez avoir recours aux enums (cf. le chapitre Support des enums)

Migration de SwiftMailer à Symfony Mailer

Toujours du fait de cette dépendance à (une partie de) Symfony 6.0, il faut désormais passer de SwiftMailer à Symfony Mailer, le premier ayant été déprécié par les développeurs de Symfony.
C'est sans doute là le point de mise à jour le plus délicat de cette nouvelle version mais, comme à chaque fois, la documentation de Laravel explique point par point ce qu'il faut modifier/vérifier lors de la mise à jour.

Pour ceux qui veulent en savoir plus sur les raisons de ce changement par Symfony, vous pouvez vous reporter à ce billet de blog.

Anonymous Stub Migrations par défaut

On en parlait déjà dans une précédente dépêche : il s'agit ici d'une nouveauté apparue dans Laravel 8.37, consistant à rendre anonyme les scripts de migration.
Pour rappel, les scripts de migration sont un mécanisme de migration de la structure de la base de données, reposant sur des scripts horodatés.
Jusqu'à présent, chaque script était une classe (héritant de la classe Migration fournie par Laravel) contenant les modifications à effectuer.
Problème : cette classe doit avoir un nom unique (car tous les scripts de migration sont dans le même namespace). Ce qui n'est pas toujours pratique, quand le nombre de scripts est de plusieurs centaines.
Le fait de rendre ces scripts anonymes résout le problème du conflit entre classes de même nom.

On passe donc de ceci :

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class MaClasseAvecUnNomUniquePourNePasEntrerEnConflitAvecLes300AutresClassesDeMigration extends Migration {
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('people', function (Blueprint $table) {
            $table->string('first_name')->nullable();
        });
    }
};

à cela :

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration {
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('people', function (Blueprint $table) {
            $table->string('first_name')->nullable();
        });
    }
};

Laravel 8.37 a permis d'écrire des scripts avec des classes anonymes, Laravel 9 rend ce comportement par défaut.

Nouveau design pour la commande routes:list

La commande php artisan routes:list, qui sert à lister toutes les URL auquel votre projet peut répondre (en indiquant pour chacune le verbe HTTP concerné, l'alias éventuel, le contrôleur qui sera exécuté, les middlewares invoqués, …) se refait une fraîcheur !

Désormais, la sortie de cette commande passe de ceci : Old design for routes:list

à cela : New Design for routes:list

Coloration syntaxique des verbes HTTP et des paramètres dans l'URL, affichage désormais responsive (finis les tableaux plus grands que la largeur de la console, et qui débordent sur la ligne du dessous, rendant l'affichage difficilement lisible), informations affichées dépendant de paramètres passés à la commande (ex : les middlewares n'apparaissent plus, par défaut), …

Flysystem 3.x

Flystystem est une couche d'abstraction pour accéder à des systèmes de fichiers, locaux (sur disque ou en mémoire) ou distants (FTP, AWS S3, …).
C'est notamment par lui que transitent les uploads depuis un formulaire, les envois/réceptions vers/depuis des sources extérieures (cloud, …).

Nouvelle façon de définir des accesseurs/mutateurs aux modèles

Par défaut dans Laravel, les propriétés des classes-modèles correspondent aux champs de la table à laquelle est liée ladite classe. Mais il est bien évidemment possible d'ajouter de nouvelles propriétés, sans que celles-ci ne soient stockées en base.

Ex :

public function getFullnameAttribute()
{
    return $this->firstname . ' ' . $this->lastname;
}

public function setFullameAttribute($fullname)
{
    list($firstname, $lastname) = explode(' ', $fullname);

    $this->attributes['firstname'] = $firstname;
    $this->attributes['lastname'] = $lastname;
}

Pour des raisons évidentes "d'auto-détection" des propriétés ajoutées, les noms des méthodes suivent une syntaxe imposée par Laravel : getXxxAttribute et setXxxAttribute.

Laravel 9 propose désormais une nouvelle approche (tout en gardant l'ancienne toujours utilisable) :

use Illuminate\Database\Eloquent\Casts\Attribute;

public function fullname(): Attribute
{
    return new Attribute(
        get: fn () => $this->firstname . ' ' . $this->lastname,
        set: fn ($value) => [
            'firstname' => explode(' ', $fullname)[0],
            'lastname'  => explode(' ', $fullname)[1],
        ],
    );
}

À noter l'usage des paramètres nommés get: et set: qui sont une nouveauté de PHP 8.

Support des Enums

PHP 8.1 ayant apporté le support des enums, il n'a pas fallu longtemps pour que Laravel en fasse autant !
Il est donc désormais possible de caster une propriété d'un modèle pour qu'elle n'accepte que les valeurs supportées par un enum donné :

use App\Enums\ServerStatus;

/**
 * The attributes that should be cast.
 *
 * @var array
 */
protected $casts = [
    'status' => ServerStatus::class,
];

Ici, ServerStatus est un enum contenant un certain nombre de valeurs. La propriété status ne peut désormais accepter autre chose que ces valeurs.

Autre possibilité : avoir une URL qui n'accepte que les valeurs d'un enum donné :

enum Category: string
{
    case Fruits = 'fruits';
    case People = 'people';
}

Route::get('/categories/{category}', function (Category $category) {
    return $category->value;
});

Toute autre valeur que "fruits" ou "people" provoquera une erreur 404.

Affichage de la couverture de code

La commmande php artisan test, qui sert à lancer les tests unitaires/features d'un projet Laravel, a reçu un nouveau paramètre optionnel --coverage permettant d'afficher la couverture de code, sous forme de pourcentage.
Il est même possible de définir un pourcentage minimum à atteindre, en-deçà duquel l'exécution des tests sera considérée comme ayant échoué.
Test Coverage Using Artisan test Command

Et bien d'autres choses encore

La liste complète des améliorations est à retrouver sur la page "Release notes" indiquée en début de dépêche.

Laracon 2022

La conférence annuelle sur Laravel commence ce 9 février. Points particuliers : elle est intégralement en ligne (pour des raisons évidentes d'actualité sanitaire), mais surtout : les places sont gratuites ! Merci pour cela aux sponsors de Laravel qui l'ont financée intégralement.

Laravel Nova 4

Nova est un package développé par l'équipe de Laravel permettant de créer et gérer un dashboard admin. Sortie en version 4 est prévu pour le mois prochain.
À noter que, contrairement à Laravel, Nova est payant et propriétaire.

Aller plus loin

  • # Non LTS

    Posté par  . Évalué à 6.

    Le créateur de Laravel à décidé que cette version ne serait pas une LTS en cause un paquets Symfony qui n'est pas dans le pipe.

    https://twitter.com/taylorotwell/status/1491834866295525389

    Le releases Notes, ne l'indique pas non plus : https://laravel.com/docs/9.x/releases

    Voici la raison de la non LTS de Laravel : https://github.com/symfony/symfony/pull/45377

    Bonne journée à vous.

    • [^] # Re: Non LTS

      Posté par  . Évalué à 3.

      Damned !

      Pour ma défense : l'annonce de Taylor date d'après la date de sortie de Laravel 9, et le site https://laravelversions.com continue à l'indiquer comme étant une LTS (mais je ne sais pas s'il s'agit d'un site officiel).

  • # Introduction de Laravel

    Posté par  (site web personnel) . Évalué à 1. Dernière modification le 13 février 2022 à 11:18.

    Merci pour cette dépêche.
    Un petit point qui m'a manqué serait un paragraphe en introduction débutant par "Pour rappel" et précisant que Laravel est un framework PHP pour le développement de sites Web, avec une courte liste des fonctionnalités si besoin.

    Je sais que PHP est presque exclusivement utilisé pour du développement Web (mais pas que, cf. l'émission CPU sur PHP) , mais pour les béotiens comme moi, ça ne fait pas de mal…

  • # Merci

    Posté par  . Évalué à 3.

    Superbe dépêche.

    Content de voir que Laravel se porte toujours aussi bien et qu'il évolue dans le bon sens.
    J'ai appris à aimer Php grâce à lui :D.

    L'ergonomie et la lisibilité des outils en ligne de commande donne vraiment envie !

    Ça manque à beaucoup d'outil je trouve.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.