Laravel 13.35 Nouveauté Publié le

Des valeurs par défaut calculées avec defaults()

Le trait HasDefaultAttributes donne au modèle une méthode defaults() : des valeurs par défaut qui peuvent lire la configuration ou l'heure, dès new Abonnement.

Notions abordées : Eloquent

Nouveau dans Laravel 13.35. Un modèle Eloquent déclare ses valeurs par défaut dans la propriété $attributes. Mais une propriété PHP n'accepte que des constantes : impossible d'y écrire now()->addDays(14) ou config('abonnements.formule_par_defaut'). On se rabattait sur un écouteur creating, qui ne passe qu'au moment de l'enregistrement : avant, le modèle ne connaît pas la valeur.

Avant

protected $attributes = ['formule' => 'decouverte'];

protected static function booted(): void
{
    static::creating(fn (Abonnement $abonnement) => $abonnement->essai_jusqu_au ??= now()->addDays(14));
}

Depuis Laravel 13.35

Le trait HasDefaultAttributes donne au modèle une méthode defaults(), appelée à chaque new :

use Illuminate\Database\Eloquent\Concerns\HasDefaultAttributes;

class Abonnement extends Model
{
    use HasDefaultAttributes;

    protected function defaults(): array
    {
        return [
            'formule' => config('abonnements.formule_par_defaut'),
            'essai_jusqu_au' => now()->addDays(14),
        ];
    }
}

Les valeurs sont posées par le constructeur, avant fill() : celles qu'on passe à new Abonnement([...]) ou à create() les remplacent. Elles sont aussi posées telles quelles, sans passer par les mutateurs.

À faire

GET /api/abonnements/apercu montre au client l'abonnement qu'il s'apprête à souscrire, avant tout enregistrement. Il n'y voit pas de fin d'essai, et la formule proposée ignore config/abonnements.php. Les requêtes de l'onglet « Requêtes » le montrent.

Déplacez les valeurs par défaut du modèle Abonnement dans defaults() : la formule et la durée de l'essai viennent de la configuration, et resilie vaut false. L'écouteur creating n'a plus de raison d'être.

D'où vient la fonctionnalité : la pull request d'origine.