Paul Redmond a présenté cette évolution dans Laravel News le 1er octobre 2026. Laravel 14 ajoute aux modèles Eloquent une méthode protégée defaults(): array. La propriété $attributes convient toujours aux valeurs fixes. Les propriétés PHP ne peuvent toutefois recevoir que des expressions constantes lors de leur initialisation. Les appels à config(), now() et les contrôles de fonctionnalités doivent donc être évalués ailleurs.
<?php
class Subscription extends Model
{
protected function defaults(): array
{
return [
'cancelled' => false,
'trial_days' => Feature::active('extended-trials') ? 30 : 14,
'expires_at' => now()->addDays(config('billing.grace_period'))->toDateTimeString(),
];
}
}L'exemple porte sur un modèle Subscription. Une nouvelle souscription reçoit 14 jours d'essai et cancelled vaut false. Lorsque Feature::active('extended-trials') est actif, trial_days passe à 30. La méthode calcule aussi expires_at avec now()->addDays(config('billing.grace_period'))->toDateTimeString(). Avec l'ancienne approche, le constructeur vérifiait le drapeau de fonctionnalité et modifiait trial_days avant l'appel à parent::__construct($attributes).
Au moment de construire le modèle, Eloquent exécute defaults() puis combine ses résultats avec les attributs. Les valeurs de $attributes sont prises en compte en premier. defaults() remplace les clés communes, puis les valeurs données à new, create() ou fill() prennent le dessus. Ainsi, Subscription::create(['trial_days' => 60]) conserve 60. Cette fusion intervient avant la synchronisation des attributs d'origine. Les valeurs par défaut ne rendent donc pas le modèle dirty, mais elles sont écrites en base lors de l'insertion.
Les valeurs renvoyées par defaults() sont brutes. Aucun cast ni mutateur ne les transforme à ce stade. Une colonne settings castée en array ou en JSON doit recevoir une chaîne JSON, par exemple json_encode(['theme' => 'light']). Pour une date, l'exemple utilise now()->addDays(30)->toDateTimeString(). Un tableau PHP placé dans une colonne soumise à un cast array ou JSON provoque une erreur lors de la lecture, car le cast attend du JSON.
defaults() s'exécute à chaque création d'une instance Eloquent, y compris pendant l'hydratation de résultats venant de la base. Eloquent crée une instance par ligne récupérée, puis les valeurs de cette ligne remplacent les valeurs par défaut calculées.
Laravel 11 avait déjà fait évoluer les casts en remplaçant la propriété $casts du squelette d'application par la méthode casts(). Laravel 14 réserve defaults() aux attributs par défaut, car un modèle existant peut déjà utiliser ce nom. Avant la mise à niveau, il faut rechercher les occurrences avec `grep -rn "function defaults" app/Models` et renommer les méthodes qui ont un autre rôle. Jack Bayliss a contribué au changement dans la PR #61688. Le code a été fusionné dans la branche master, mais il peut encore évoluer avant la sortie de Laravel 14.




Commentaires
Pas encore de commentaire — écris le premier.
Lance la discussion
Pas de compte ni de mot de passe — saisis simplement ton adresse e-mail et nous t’envoyons un lien de connexion à usage unique. Première visite ? Tout se met en place automatiquement.
Ton évaluation sera appliquée automatiquement après ta connexion.
Vérifie ta boîte mail
Nous avons envoyé un lien de connexion à …. Ouvre-le sur cet appareil — cet onglet te connectera automatiquement.
Rien reçu ? Vérifiez le dossier spam — et marquez le message « Non spam » pour qu'il arrive directement la prochaine fois.