Laravel et ses autres paquets suivent le système de versionnement sémantique. Les versions majeures du framework sont publiées chaque année dans les environs de février, tandis que les versions mineures et les correctifs peuvent être publiés aussi souvent que chaque semaine. Les versions mineures et les correctifs ne doivent jamais contenir de modifications de rupture.
Laravel est passé à des versions annuelles avec la sortie de Laravel 8. Auparavant, les versions majeures étaient publiées tous les 6 mois. Selon l’équipe de développement, cette transition a pour but d'alléger la charge de maintenance de la communauté et de mettre cette équipe de développement au défi de livrer de nouvelles fonctionnalités sans introduire de changements radicaux.
« Cet engagement à livrer de grandes nouvelles fonctionnalités au cours de la version actuelle conduira probablement à ce que les futures versions "majeures" soient principalement utilisées pour des tâches de maintenance telles que la mise à niveau des dépendances en amont, ce qui peut être vu dans ces notes de version », déclare l’équipe.
Lorsqu’on fait référence au framework Laravel ou à ses composants à partir de d’une application ou de d’un paquetage, il est recommandé de toujours utiliser une contrainte de version telle que ^9.0, car les versions majeures de Laravel contiennent des modifications de rupture. Voici, ci-dessous, les améliorations apportées par Laravel 9.0 :
Arguments nommés
Les arguments nommés ne sont pas couverts par les directives de rétrocompatibilité de Laravel. Pour l’équipe de développement, l'utilisation d'arguments nommés lors de l'appel de méthodes Laravel doit se faire avec prudence et en sachant que les noms des paramètres peuvent changer à l'avenir.
Politique de support
Pour les versions LTS, telles que Laravel 9, les corrections de bogues sont fournies pendant 2 ans et les corrections de sécurité sont fournies pendant 3 ans. Pour les versions générales, les corrections de bogues sont fournies pendant 18 mois et les corrections de sécurité sont fournies pendant 2 ans. Pour toutes les bibliothèques supplémentaires, y compris Lumen, seule la dernière version reçoit des corrections de bogues. Laravel 9.x requiert une version minimale de PHP de 8.0.
Amélioration des accesseurs / mutateurs éloquents
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 le modèle comme suit :
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 | public function getNameAttribute($value) { return strtoupper($value); } public function setNameAttribute($value) { $this->attributes['name'] = $value; } |
Toutefois, dans Laravel 9.x, il est possible de 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 :
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 | use Illuminate\Database\Eloquent\Casts\Attribute; public function name(): Attribute { return new Attribute( get: fn ($value) => strtoupper($value), set: fn ($value) => $value, ); } |
En outre, cette nouvelle approche de la définition des accesseurs mettra en cache les valeurs des objets renvoyés par l'attribut, tout comme les classes de cast personnalisées :
Casting d'attributs éloquent d'Enum
Eloquent permet maintenant de convertir les valeurs d'attributs en enums PHP. Pour ce faire, il est possible de spécifier l'attribut et l'enum souhaitez convertir dans le tableau de propriétés $casts du modèle :
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 | use App\Enums\ServerStatus; /** * The attributes that should be cast. * * @var array */ protected $casts = [ 'status' => ServerStatus::class, ]; |
Une fois que vous avez défini le cast sur votre modèle, l'attribut spécifié sera automatiquement converti en un enum lorsque vous interagirez avec cet attribut :
Code : | Sélectionner tout |
1 2 3 4 5 | if ($server->status == ServerStatus::provisioned) { $server->status = ServerStatus::ready; $server->save(); } |
Liaisons implicites de routes avec les Enums
PHP 8.1 introduit le support des Enums. Laravel 9.x introduit la possibilité de saisir un Enum dans la définition de d’une 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, avec l'Enum suivante :
Code : | Sélectionner tout |
1 2 3 4 5 | enum Category: string { case Fruits = 'fruits'; case People = 'people'; } |
Code : | Sélectionner tout |
1 2 3 | Route::get('/categories/{category}', function (Category $category) { return $category->value; }); |
Dans les versions précédentes de Laravel, vous pouvez souhaiter étendre le second modèle Eloquent dans une définition de route de sorte qu'il soit un enfant du modèle Eloquent précédent. Par exemple, considérez cette définition de route qui récupère un article de blog par slug pour un utilisateur spécifique :
Code : | Sélectionner tout |
1 2 3 4 5 6 | 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 comme paramètre de route imbriquée, Laravel étend 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 la route enfant. Cependant, dans Laravel 9.x, il est maintenant possible de demander à Laravel de mettre en place des liaisons "enfant" même si une clé personnalisée n'est pas fournie. Pour ce faire, il est possible d’invoquer la méthode scopeBindings lors de la définition de d’une route :
Code : | Sélectionner tout |
1 2 3 4 5 6 | use App\Models\Post; use App\Models\User; Route::get('/users/{user}/posts/{post}', function (User $user, Post $post) { return $post; })->scopeBindings(); |
Il est également possible de demander à un groupe entier de définitions d'itinéraires d'utiliser des liaisons scopées :
Code : | Sélectionner tout |
1 2 3 4 5 | Route::scopeBindings()->group(function () { Route::get('/users/{user}/posts/{post}', function (User $user, Post $post) { return $post; }); }); |
Moteur de base de données Laravel Scout
Si l’application interagit avec des bases de données de petite ou moyenne taille ou a une charge de travail légère, avec Laravel 9.0, il est maintenant possible d’utiliser le moteur de base de données de Scout au lieu d'un service de recherche dédié comme Algolia ou MeiliSerach. Le moteur de base de données utilisera des clauses where like et des index plein texte lors du filtrage des résultats de la base de données existante pour déterminer les résultats de recherche applicables à la requête.
Rendu des modèles Blade en ligne
Face au besoin de transformer une chaîne brute de modèle Blade en HTML valide, il est possible d’accomplir cela en utilisant la méthode de rendu fournie par la façade Blade. La méthode de rendu accepte la chaîne du modèle Blade et un tableau optionnel de données à fournir au modèle :
Code : | Sélectionner tout |
1 2 3 | use Illuminate\Support\Facades\Blade; return Blade::render('Hello, {{ $name }}', ['name' => 'Julian Bashir']); |
De même, la méthode renderComponent peut être utilisée pour rendre un composant de classe donné en passant l'instance du composant à la méthode :
use App\View\Components\HelloComponent;
Code : | Sélectionner tout |
return Blade::renderComponent(new HelloComponent('Julian Bashir'));
Amélioration de la validation des données des tableaux imbriqués
Pour accéder à la valeur d'un élément de tableau imbriqué donné lorsque des règles de validation sont assignées à l'attribut, il est désormais possible de le faire en utilisant la méthode Rule::forEach. La méthode forEach accepte une fermeture qui sera invoquée pour chaque itération de l'attribut du tableau en cours de validation et qui recevra la valeur de l'attribut et son nom explicite, entièrement développé. La fermeture doit renvoyer un tableau de règles à affecter à l'élément du tableau :
Code : | Sélectionner tout |
1 2 3 4 5 6 7 | use App\Rules\HasPermission; use Illuminate\Support\Facades\Validator; use Illuminate\Validation\Rule; $validator = Validator::make($request->all(), [ 'companies.*.id' => Rule::forEach(function ($value, $attribute) { return [ Rule::exists(Company::class, 'id'), new HasPermission('manage-company', $value), ]; }), ]); |
Laravel 9.x ajoute des définitions de types améliorées, de style "générique", au composant collections, améliorant ainsi le support des IDE et de l'analyse statique. Les IDE tels que PHPStorm ou les outils d'analyse statique tels que PHPStan comprendront désormais mieux les collections Laravel de manière native.
Source : Laravel
Et vous ?
Utilisez-vous le langage PHP ? Que pensez-vous du framework Laravel ?
Quelle amélioration vous intéresse le plus dans la version 9 de Laravel ?
Quelles sont vos attentes ?
Quel Framework PHP utilisez-vous ? Pourquoi ?
Voir aussi :
Laravel 7 est disponible, une version majeure avec des améliorations de la vitesse de routage, des balises de composants Blade et autres
PHP conserve la première place en tant que langage de programmation côté serveur sur le Web avec près de 79% d'utilisation, selon un rapport de la W3Techs
PHP 8.1 est disponible. Cette version permet d'obtenir une référence à n'importe quelle fonction et apporte le type de retour never
La version 3.2 du framework Django est disponible, avec la découverte automatique d'AppConfig, elle apporte de nouveaux décorateurs pour le module d'administration