Paul Redmond beschrieb die Änderung am 1. Oktober 2026 bei Laravel News. Laravel 14 ergänzt für Eloquent-Modelle eine geschützte Methode defaults(): array. Die Eigenschaft $attributes bleibt für feste Werte geeignet. PHP erlaubt bei Property-Initialisierern jedoch nur konstante Ausdrücke. Aufrufe von config(), now() und Feature-Prüfungen müssen deshalb an anderer Stelle erfolgen.
<?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(),
];
}
}Das Beispiel verwendet ein Subscription-Modell. Neue Abonnements erhalten zunächst 14 Testtage, während cancelled auf false steht. Ist Feature::active('extended-trials') aktiv, setzt die Methode trial_days auf 30. Zusätzlich berechnet sie expires_at mit now()->addDays(config('billing.grace_period'))->toDateTimeString(). Zuvor musste der Konstruktor die Feature-Prüfung ausführen und trial_days vor parent::__construct($attributes) ändern.
Beim Erzeugen eines Modells führt Eloquent defaults() aus und führt die Ergebnisse mit den Attributen zusammen. Werte aus $attributes kommen zuerst. defaults() überschreibt denselben Schlüssel, danach gewinnen Werte aus new, create() oder fill(). Subscription::create(['trial_days' => 60]) verwendet daher weiterhin 60. Die Zusammenführung erfolgt vor der Synchronisierung der ursprünglichen Attribute. Die Standardwerte gelten deshalb nicht als dirty, werden beim Einfügen aber wie Werte aus $attributes gespeichert.
Die Rückgabewerte von defaults() sind Rohwerte. Casts und Mutatoren verarbeiten sie an dieser Stelle nicht. Für eine als array oder JSON gecastete Spalte muss beispielsweise json_encode(['theme' => 'light']) zurückgegeben werden. Datumswerte können mit now()->addDays(30)->toDateTimeString() erzeugt werden. Ein PHP-Array in einer solchen Spalte führt beim Lesen zu einem Fehler, weil der Cast JSON erwartet.
defaults() läuft bei jeder Konstruktion eines Eloquent-Modells. Das gilt auch für das Hydrieren von Datenbankzeilen. Für jede geladene Zeile entsteht eine neue Instanz, danach ersetzen die gespeicherten Werte die berechneten Standardwerte.
Laravel 11 hatte eine ähnliche Umstellung bei Casts vorgenommen. Das Anwendungsskelett wechselte dort von $casts zu casts(). Laravel 14 reserviert defaults() auch deshalb für diese Aufgabe, weil bestehende Modelle bereits eine Methode mit diesem Namen besitzen können. Vor dem Upgrade sollten Entwickler mit `grep -rn "function defaults" app/Models` suchen und unpassende Methoden umbenennen. Jack Bayliss steuerte die Änderung in PR #61688 bei. Sie ist in den master-Zweig eingeflossen und kann sich vor der Veröffentlichung von Laravel 14 noch ändern.




Kommentare
Noch keine Kommentare — schreib den ersten.
Starte die Diskussion
Kein Konto, kein Passwort nötig — gib einfach deine E-Mail-Adresse ein, wir senden dir einen einmaligen Anmelde-Link. Beim ersten Mal bist du damit automatisch angemeldet.
Deine Bewertung wird nach der Anmeldung automatisch übernommen.
Schau in dein Postfach
Wir haben einen Anmelde-Link an … gesendet. Öffne ihn auf diesem Gerät — dieser Tab meldet dich automatisch an.
Nichts angekommen? Wirf einen Blick in den Spam-Ordner — und markiere die Mail dort als „Kein Spam“, dann landet sie künftig direkt im Postfach.