Laravel 9

Par:
fredericmazue

jeu, 10/02/2022 - 12:20

Le projet Laravel, qui est depuis peu passé à un rythme de publications annuelles des nouvelles versions du framework, vient d'annoncer la disponibilité de Laravel 9.

Laravel 9 nécessite une version PHP minimale de 8.0. Alors que les versions précédentes de Laravel utilisaient la bibliothèque Swift Mailer pour envoyer des e-mails sortants, c'est désormais Symfony Mailer qui est utilisé. Un guide de mise à niveau est fourni pour permettre aux développeurs d'assurer la compatibilité de leur application avec Symfony Mailer.

Parmi les nouveautés apportées par le framework, ont remarquera particulièrement l'amélioration des accesseurs/mutateurs Eloquent.

Laravel 9 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;
}

Avec Laravel 9, 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 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,
    );
}

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,
        ],
    );
}