Laravel 9 : Quoi de neuf dans cette nouvelle version du framework ? - Letecode

Laravel 9 : Quoi de neuf dans cette nouvelle version du framework ?

Laravel a été l'un des frameworks PHP les plus répandus . Il est adaptable, évolutif, polyvalent et est devenu l'un des systèmes en fait pour les ingénieurs et les entreprises travaillant avec PHP. Maintenant, Laravel 9 est en route, avec un certain nombre de nouvelles fonctionnalités.

Jean Claude Mbiya
Jean Claude Mise à jour : 21 décembre 2022 2028

Il n'est pas surprenant que Laravel soit devenu l'un des principaux frameworks PHP pour la création d'applications Web de révision d'efforts, d'applications personnalisées et robustes. Laravel vise toujours à rendre le processus d'avancement plus fluide et plus rapide ; Ainsi, ils recherchent en permanence de nouvelles versions avec de nouvelles fonctionnalités, fonctionnalités, avancées et bien plus encore.

Laravel a subi plusieurs mises à jour. Ses caractéristiques et fonctionnalités se sont si bien développées qu'il est devenu le système PHP incontournable pour le développement d'applications Web.

Initialement prévue pour septembre 2021, Laravel 9 a été repoussée à janvier 2022, ce qui en fait la première version de soutien à long terme (LTS) à être introduite après le cycle de publication de 12 mois. Discutons de toutes les nouvelles fonctionnalités et mises à jour de Laravel 9 qui ont été annoncées jusqu'à présent.

Laravel 9 et à quoi s'attendre

Laravel 9 serait le premier support à long terme publié dans un cycle de publication de 12 mois et il a été initialement annoncé qu'il serait publié en septembre 2021. Cependant, il a ensuite été décidé de le repousser jusqu'en janvier 2022.

Laravel a des dépendances système dans différentes bibliothèques communautaires et Symfony 9, et Symfony avait prévu de publier Symfony v6.0 en novembre 2021, ce qui a conduit l'équipe Laravel à retarder la sortie de Laravel v9.

Pour mettre à niveau ou mettre à jour le framework Laravel complet vers la version la plus récente de Symfony , cela prendra un certain temps et aussi beaucoup de tests et de surveillance contre tout changement de rupture avant de le publier sur le marché.

Enfin, le report de la sortie de Laravel 9 jusqu'en janvier 2022 permettra de mieux positionner l'équipe Laravel pour publier le LTS qui s'ensuit chaque année. Donner à l'équipe Laravel 2 mois après les sorties de Symfony..

Maintenant que vous connaissez les raisons des changements, explorons le nouveau Laravel v9 avant sa sortie le 22 janvier 2022.

Laravel 9 Nouvelles fonctionnalités

Exigences PHP minimales

Laravel 9 nécessite la forme la plus récente de PHP 8 , PHPUnit 9 et un certain nombre d'autres prérequis spécifiés dans le futur.

Laravel, en tant que framework, dépend de plusieurs bibliothèques communautaires et Symfony 9. Comme Symfony prévoyait de publier la v6.0 en novembre 2021, cela a forcé l'équipe Laravel à retarder la sortie de Laravel v9. L'exigence PHP 8 est due au fait que Laravel 9 dépend uniquement de la dernière version v6.0 de Symfony, qui dépend de PHP 8.

Vous pouvez explorer les nouveautés de PHP 8 et les références des versions PHP distinctives pour saisir les avancées et les fonctionnalités de PHP 8, du compilateur juste-à-temps (JIT) à la promotion des propriétés du constructeur.

Anonymous Stub Migrations

Laravel définit l'introduction de la migration anonyme comme comportement par défaut lorsque vous exécutez la commande de migration populaire :

php artisan make:migration


La fonctionnalité de migration anonyme (Anonymous Migrations) a été introduite pour la première fois dans Laravel 8.37 pour résoudre lun bug de Github. Le problème rencontré avec plusieurs migrations dans le même nom de classe peut entraîner des problèmes lors de la tentative de recréation de la base de données entière. La fonction de stub migration élimine les conflits de noms de classe de migration.

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();
        });
    }
};

 

Nouvelle interface du générateur de requêtes (Query Builder)

Avec Laravel 9, l'indication de type est extrêmement fiable pour la refactorisation, l'analyse inactive et la complétion de code dans leurs IDE. Cela est dû au besoin d'une interface partagée ou d'un héritage entre QueryBuilder, EloquentBuilder et EloquentRelation. Pourtant, avec Laravel 9, les ingénieurs peuvent désormais profiter de la nouvelle interface de création de requêtes pour l'indication de type, la refactorisation et l'analyse statique.

return Model::query()
	->whereNotExists(function($query) {
		// $query is a Query\Builder
	})
	->whereHas('relation', function($query) {
		// $query is an Eloquent\Builder
	})
	->with('relation', function($query) {
		// $query is an Eloquent\Relation
	});


Cette fonctionnalité ajoute une nouvelle interface Illuminate\Contracts\Database\QueryBuilder et un trait Illuminate\Database\Eloquent\Concerns\DecoratesQueryBuilder qui implémente l'interface à la place de l'implémentation __call existante.

Fonctions de chaîne PHP 8 (Str)

Étant donné que Laravel 9 cible PHP 8, Laravel a combiné ce PR, suggérant d'utiliser les fonctions de chaîne PHP 8 les plus récentes.

Ces fonctions intègrent l'utilisation de str_contains(), str_starts_with() et str_ends_with() en interne dans la classe Illuminate\Support\Str.

Nouvelle conception pour les routes:list


La commande routes:list  est incluse dans Laravel depuis longtemps maintenant, et un problème qui se pose parfois est que si vous avez défini des routes énormes et complexes, cela peut devenir désordonné en essayant de les afficher dans la console. Grâce à un PR de Nuno Maduro, cela fait peau neuve.

De SwiftMailer à Symfony Mailer

Symfony a déprécié SwiftMailer et Laravel 9 fait le changement pour utiliser Symfony Mailer pour tous les transports de courrier. Cela ouvre quelques changements de rupture et vous pouvez consulter le PR pour tous les détails. Le guide de mise à niveau de Laravel 9 comprendra des instructions une fois qu'il sera officiellement publié.

Le fichier server.php peut être supprimé

Une fonctionnalité mineure mais vous pouvez maintenant supprimer le fichier server.php de votre projet et il sera inclus dans le framework. Ce fichier n'est utilisé que pour php artisan serve.

Les fonctionnalités et améliorations de Laravel 9 répertoriées sont un aperçu de ce qui est à venir. Il apportera très certainement des corrections de bogues, des fonctionnalités et, bien sûr, de nombreux changements révolutionnaires.

Accesseurs/mutateurs éloquents améliorés

Les accesseurs / mutateurs Eloquent améliorés ont été apportés par Taylor Otwell.

Laravel 9.x offre une nouvelle façon de définir les accesseurs et mutateurs Eloquent. Dans les versions précédentes de Laravel, la seule façon de définir les accesseurs et les mutateurs était de définir des méthodes préfixées sur votre modèle comme suit :

 

public function getNameAttribute($value)
{

    return strtoupper($value);

}


public function setNameAttribute($value)
{

    $this->attributes['name'] = $value;

}

Cependant, dans Laravel 9.x, vous pouvez définir un accesseur et un mutateur à l'aide d'une seule méthode non préfixée en indiquant un type de retour de Illuminate\Database\Eloquent\Casts\Attribute:

 

use Illuminate\Database\Eloquent\Casts\Attribute;

public function name(): Attribute

{

  return new Attribute(
      get: fn ($value) => strtoupper($value),
      set: fn ($value) => $value,
    );

}

De plus, cette nouvelle approche de la définition des accesseurs mettra en cache les valeurs d'objet renvoyées par l'attribut, tout comme les classes de cast personnalisées :

 

use App\Support\Address;
use Illuminate\Database\Eloquent\Casts\Attribute;


public function address(): Attribute
{

    return new Attribute(

      get: fn ($value, $attributes) => new Address(
          $attributes['address_line_one'],
          $attributes['address_line_two'],
        ),

      set: fn (Address $value) => [
          'address_line_one' => $value->lineOne,
          'address_line_two' => $value->lineTwo,
        ],

    );

}

Liaisons de routes implicites avec des énumérations

Les liaisons Enum implicites ont été fournies par Nuno Maduro.

PHP 8.1 introduit la prise en charge des Enums. Laravel 9.x introduit la possibilité de taper un Enum sur votre définition de route et Laravel n'invoquera la route que si ce segment de route est une valeur Enum valide dans l'URI. Sinon, une réponse HTTP 404 sera renvoyée automatiquement. Par exemple, étant donné l'énumération suivante :

enum Category: string
{

  case Fruits = 'fruits';
    case People = 'people';

}

Vous pouvez définir une route qui ne sera invoquée que si le segment {category} de route est fruits ou people. Sinon, une réponse HTTP 404 sera renvoyée :

 

Route::get('/categories/{category}', function (Category $category) {

    return $category->value;

});

Groupes de routage de contrôleur

Les améliorations du groupe de routes ont été apportées par Luke Downing.

Vous pouvez maintenant utiliser la méthode controller pour définir le contrôleur commun pour toutes les routes du groupe. Ensuite, lors de la définition des routes, il vous suffit de fournir la méthode de contrôleur qu'ils invoquent :

 

use App\Http\Controllers\OrderController;

Route::controller(OrderController::class)->group(function () {

  Route::get('/orders/{id}', 'show');
    Route::post('/orders', 'store');

});

Casting d'attributs éloquents Enum

Le casting Enum n'est disponible que pour PHP 8.1+.

 

Le casting d'Enum a été assuré par Mohamed Said.

Eloquent vous permet désormais de convertir vos valeurs d'attribut en énumérations PHP. Pour ce faire, vous pouvez spécifier l'attribut et l'énumération que vous souhaitez convertir dans le tableau $casts de propriétés de votre modèle :

use App\Enums\ServerStatus;


/**
* The attributes that should be cast
*
* @var array
 */

protected $casts = [

    'status' => ServerStatus::class,

];

Une fois que vous avez défini la distribution sur votre modèle, l'attribut spécifié sera automatiquement converti vers et depuis une énumération lorsque vous interagissez avec l'attribut :

 

if ($server->status == ServerStatus::provisioned) {

  $server->status = ServerStatus::ready;
    $server->save();

}

Liaisons à portée forcée

Les liens à portée forcée ont été fournis par Claudio Dekker.

Dans les versions précédentes de Laravel, vous souhaiterez peut-être définir la portée du deuxième modèle Eloquent dans une définition d'itinéraire de sorte qu'il doit être un enfant du modèle Eloquent précédent. Par exemple, considérons cette définition de route qui récupère un article de blog par slug pour un utilisateur spécifique :

 

use App\Models\Post;
use App\Models\User;


Route::get('/users/{user}/posts/{post:slug}', function (User $user, Post $post) {

    return $post;

});

Lors de l'utilisation d'une liaison implicite à clé personnalisée en tant que paramètre de route imbriqué, Laravel étendra automatiquement la requête pour récupérer le modèle imbriqué par son parent en utilisant des conventions pour deviner le nom de la relation sur le parent. Cependant, ce comportement n'était auparavant pris en charge par Laravel que lorsqu'une clé personnalisée était utilisée pour la liaison de route enfant.

Cependant, dans Laravel 9.x, vous pouvez désormais demander à Laravel d'étendre les liaisons "enfants" même lorsqu'une clé personnalisée n'est pas fournie. Pour ce faire, vous pouvez invoquer la méthode scopeBindings lors de la définition de votre route :

 

use App\Models\Post;
use App\Models\User;


Route::get('/users/{user}/posts/{post}', function (User $user, Post $post) {

    return $post;

})->scopeBindings();

Ou, vous pouvez demander à un groupe entier de définitions de routes d'utiliser des liaisons étendues :

 

Route::scopeBindings()->group(function () {

    Route::get('/users/{user}/posts/{post}', function (User $user, Post $post) {

        return $post;

    });

});

API Laravel Breeze et Next.js

L'échafaudage API Laravel Breeze et le kit de démarrage Next.js ont été fournis par Taylor Otwell et Miguel Piedrafita.

Le kit de démarrage Laravel Breeze a reçu un mode d'échafaudage "API" et une implémentation frontale Next.js gratuite. Cet échafaudage de kit de démarrage peut être utilisé pour démarrer vos applications Laravel qui servent de backend, API authentifiée Laravel Sanctum pour une interface JavaScript.

Moteur de base de données Laravel Scout

Le moteur de base de données Laravel Scout a été fourni par Taylor Otwell et Dries Vints.

Si votre application interagit avec des bases de données de petite à moyenne taille ou a une charge de travail légère, vous pouvez désormais utiliser le moteur "base de données" de Scout au lieu d'un service de recherche dédié tel qu'Algolia ou MeiliSerach. Le moteur de base de données utilisera des clauses "where like" et des index de texte intégral lors du filtrage des résultats de votre base de données existante pour déterminer les résultats de recherche applicables à votre requête.

 

Pourquoi passer de Laravel 8 à 9

Flysystem 3.x

Laravel 9.x a migré vers Flysystem 3.x. Sous le capot, Flysystem alimente toutes les stratégies de manipulation d'enregistrements données par la façade Capacity. À la lumière de cela, quelques modifications peuvent être nécessaires dans votre application. Dans tous les cas, nous avons tenté de créer ce mouvement aussi cohérent que possible.

Messagerie Symfony

L'un des plus grands changements dans Laravel 9.x est le passage de SwiftMailer , qui n'est plus maintenu depuis décembre 2021, à Symfony Mailer. Cependant, Laravel a tenté de créer ce mouvement aussi cohérent que possible pour vos applications. Cela étant dit, il serait idéal que vous examiniez complètement la liste des modifications ci-dessous pour vous assurer que votre application est parfaitement cohérente.

Custom Casts & null

Dans les versions précédentes de Laravel, la stratégie d'ensemble des classes de distribution personnalisées n'était pas invoquée dans le cas où l'attribut cast était défini sur null. Cependant, ce comportement était en conflit avec la documentation de Laravel. Dans Laravel 9.x, la stratégie d'ensemble du cours de distribution sera invoquée avec null comme argument $value donné. Par conséquent, vous devez vous assurer que vos casts personnalisés sont capables de gérer correctement cette situation.

Délai d'expiration du client HTTP par défaut

Le client HTTP inclut désormais un délai d'attente par défaut de 30 secondes. En d'autres termes, si le serveur ne répond pas dans les 30 secondes, une exception sera levée. Déjà, aucune durée de temporisation par défaut n'a été définie sur le client HTTP, ce qui a parfois pour effet de "bloquer" les requêtes indéfiniment.

Si vous souhaitez spécifier un délai d'attente plus long pour une requête donnée, vous pouvez le faire en utilisant la méthode timeout :

$response = Http::timeout(120)->get( ... ) ;

L'annuaire lang

Dans les applications Laravel 9.x, le répertoire resources/lang est désormais situé dans le répertoire racine du projet (lang). Si votre package publie des fichiers de langue dans ce répertoire, vous devez vous assurer que votre package publie sur app()->langPath() plutôt que sur un chemin codé en dur.

La règle du mot de passe

La règle de mot de passe, qui valide que l'estime d'entrée donnée correspond au mot de passe actuel de l'utilisateur confirmé, a été renommée en current_password.

Les méthodes when / unless

Comme vous le savez peut-être, when et unless des méthodes soient proposées par différentes classes dans le framework. Ces méthodes peuvent être utilisées pour effectuer conditionnellement une action si la valeur booléenne du premier argument de la méthode est évaluée à true ou false :

$collection->when(true, function ($collection) {
    $collection->merge([1, 2, 3]);
});


Par conséquent, dans les versions précédentes de Laravel, le passage d'une fermeture aux méthodes when ou until impliquait que l'opération conditionnelle s'exécuterait toujours, car une comparaison lâche avec un objet de fermeture est toujours évaluée à true. Cela conduit souvent à des résultats surprenants puisque les ingénieurs prévoient que le résultat de la fermeture sera utilisé comme valeur booléenne qui décide si l'action conditionnelle s'exécute.

Ainsi, dans Laravel 9.x, toutes les fermetures transmises aux méthodes when ou until seront exécutées et la valeur renvoyée par la fermeture sera considérée comme la valeur booléenne utilisée par les méthodes when et until.

Influenceurs sur Laravel 9

Nous avons contacté quelques membres de la communauté et suivi des influenceurs de Twitter concernant les avis sur Laravel 9, voici ce qu'ils ont à dire à ce sujet,

Graham Cambell

Laravel 9 is mostly a release to enable us to make some breaking changes and upgrade to Symfony 6 components, move from Swift Mailer to Symfony Mailer, and upgrade to Flysystem 2. Almost every new feature has been landing in Laravel 8, with new features landing almost every week for the last year. Dries and I and many others worked hard to ensure Laravel 8 and its supporting packages worked on PHP 8.1, so there’s no need to wait until Laravel 9 to upgrade to PHP 8.1, which is super cool.


Laravel 9 est principalement une version qui nous permet d'apporter des modifications radicales et de mettre à niveau les composants de Symfony 6, de passer de Swift Mailer à Symfony Mailer et de passer à Flysystem 2. Presque toutes les nouvelles fonctionnalités ont atterri dans Laravel 8, avec de nouvelles fonctionnalités presque toutes les semaines depuis un an. Dries, moi et bien d'autres avons travaillé dur pour garantir que Laravel 8 et ses packages de support fonctionnent sur PHP 8.1, il n'est donc pas nécessaire d'attendre Laravel 9 pour passer à PHP 8.1, ce qui est super cool.

Taylor Otwell

I’m finding the Laravel 9 release is much more of a minor “maintenance” release compared to other previous major Laravel releases.Committing ourselves to only 1 “major” release a year really pushed us to ship a bunch of stuff we would have typically held back for a major.


Je trouve que la version Laravel 9 est beaucoup plus une version mineure de "maintenance" par rapport aux autres versions majeures précédentes de Laravel.

Le fait de nous engager sur une seule sortie "majeure" par an nous a vraiment poussés à livrer un tas de choses que nous aurions généralement retenues pour une majeure.

Jesse Archer

Laravel 9 doesn’t have as many headline features as a normal Laravel release because the team have been focusing on releasing new features throughout the year now that they’ve moved to a yearly release cycle.There’s a pretty comprehensive list of the new features at https://laravel-news.com/laravel-9. The one thing that isn’t mentioned there that I’m excited about is the new support for generics on the Collection class which will really help improve static analysis.


Laravel 9 n'a pas autant de fonctionnalités phares qu'une version normale de Laravel, car l'équipe s'est concentrée sur la publication de nouvelles fonctionnalités tout au long de l'année maintenant qu'elle est passée à un cycle de publication annuel.

Il y a une liste assez complète des nouvelles fonctionnalités sur https://laravel-news.com/laravel-9. La seule chose qui n'y est pas mentionnée et qui me passionne est le nouveau support des génériques sur la classe Collection qui aidera vraiment à améliorer l'analyse statique.

En conclusion

Laravel est un framework PHP convaincant qui attire de plus en plus l'attention des développeurs. Sa version majeure à venir est la principale prenant après un cycle de publication de 12 mois, et capable de voir déjà qu'elle introduira de nouvelles fonctionnalités "juteuses". Laravel ajoutera probablement de nouvelles fonctionnalités avant la date de sortie, alors suivez cet article pour les futures mises à jour et révisions.

4
Jean Claude Mbiya
Jean Claude Mbiya

Développeur Web full stack, Développeur Android (Certifié Google AAD) Formateur dans les domaines du numérique, Créateur letecode.com 👨‍💻. Je suis un grand passionné des nouvelles technologies et j'adore partager ce que j'apprend.

0 commentaire(s)

Laissez votre commentaire à @johnmbiya

ou pour laisser un commentaire