IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Laravel 9 est disponible, elle apporte une sortie route:list améliorée, un pilote de base de données Laravel Scout,
Une nouvelle syntaxe d'accesseur / mutateur Éloquent

Le , par Bruno

82PARTAGES

9  0 
L’équipe de développement de Laravel vient de publier la version 9 du framework PHP quelques mois après la sortie de Laravel 8. Laravel 9 poursuit les améliorations apportées dans Laravel 8.x en introduisant le support des composants Symfony 6.0, Symfony Mailer, Flysystem 3.0, une sortie route:list améliorée, un pilote de base de données Laravel Scout, une nouvelle syntaxe d'accesseur / mutateur Eloquent, des liaisons de route implicites via Enums, et une variété d'autres corrections de bogues et d'améliorations de la convivialité.

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';
}
Il est possible de définir une route qui ne sera invoquée que si le segment de route {category} est fruits ou People. Sinon, une réponse HTTP 404 sera renvoyée :
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

Une erreur dans cette actualité ? Signalez-nous-la !