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.

Subscription.php
<?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.