Laravel Framework 13.33.0 ist die im Artikel behandelte 13.x-Version. Laravel News veröffentlichte die ausführliche Besprechung am 23. September 2026. Sie ergänzt den vorherigen Bericht um konkrete Details für die Anwendungspraxis.

User.php
use Illuminate\Database\Eloquent\Attributes\Refreshes;

#[Refreshes('name')]
class User extends Model
{
}

Joost de Bruijn hat dem memoized Cache Store die Methode tags() hinzugefügt. Cache::memo() kann damit speicherbasierte Request-Caches mit getaggten Caches verbinden. Wiederholte Lesezugriffe erreichen das Backend einmal und verwenden danach den memoized Wert. Schreibzugriffe aktualisieren den getaggten Cache und verwerfen seine Kopie im Speicher. Das Leeren eines Tags entfernt ebenfalls die zugehörigen memoized Einträge. Laravel 12.9 hatte den ungetaggten memoized Cache eingeführt. Für getaggte Zugriffe war bisher ein zusätzlicher Aufruf von Cache::store('array') nötig. Die Änderung steht in PR #61593.

Caleb White hat das Attribut #[Refreshes] und die passende Eigenschaft $refreshes für Eloquent-Modelle beigesteuert. Beide laden ausgewählte Spalten nach dem Erstellen oder Aktualisieren eines Modells neu. Das ist für virtualAs, storedAs und andere von der Datenbank erzeugte Werte gedacht, die im Modell sonst fehlen oder veraltet sein können. Laravel führt dafür eine Abfrage auf der Schreibverbindung aus. Sie umfasst nur die angegebenen Spalten. Spaltennamen lassen sich als Array oder als variadische Argumente angeben. Im Beispiel sorgt #[Refreshes('name')] auf User dafür, dass nach dem Anlegen mit first_name und last_name der Wert "Taylor Otwell" verfügbar ist. Die Umsetzung ist in PR #61523 dokumentiert.

Zein Ahmad hat für AsCollection und AsArrayObject einen optionalen nullable()-Modus ergänzt. Die bisherigen Casts serialisieren ein zugewiesenes null weiterhin als JSON-String "null". Die nullable-Varianten speichern ein Datenbank-NULL, sodass whereNull() die Zeile findet. Verfügbar sind AsCollection::nullable() und AsArrayObject::nullable(). Die Änderung gehört zu PR #61596.

Sander Muller hat die Modifier inplace() und lock() für Index- und Fremdschlüsseloperationen ergänzt. Eine MySQL-Migration kann damit ALGORITHM=INPLACE und LOCK=NONE anfordern. In unterstützten Fällen wird so ein blockierender Tabellenumbau vermieden. Die Modifier funktionieren mit index(), unique(), primary(), fullText(), spatialIndex() und foreign(). Sie ergänzen den bereits für Spaltendefinitionen verfügbaren Modifier instant(). PR #61602 enthält die Änderung.

Md Sukkur Ali hat die Auflösung von Attributen in geerbten Form Requests korrigiert. PHP übernimmt Attribute nicht automatisch von Elternklassen. Deshalb wurden #[StopOnFirstFailure] und #[FailOnUnknownFields] auf einer gemeinsamen ApiRequest-Basisklasse bisher von Unterklassen ignoriert. StorePostRequest erhält diese Attribute nun beim Erben von ApiRequest. Der Fix steht in PR #61586.

Jack Bayliss hat Worker::$killOnTimeout ergänzt. Standardmäßig beendet ein Timeout den Worker-Prozess. Der Supervisor startet danach einen neuen Worker. Bei false wirft der Worker stattdessen TimeoutExceededException. Der Job kann dann aufräumen, während der Worker weiterläuft. Ein umfassendes try/catch um handle() kann die Exception verschlucken. Kieran Brown hat außerdem Worker::killUsing() ergänzt. Dieser Hook läuft vor SIGKILL und kann einen eigenen Exit-Code an den Supervisor weitergeben. Die Änderungen stehen in PRs #61591 und #61622.

Jenthe Noordsij trennt mit mockArtisan() und realArtisan() die beiden Verhaltensweisen von $this->artisan(). mockArtisan() liefert für Erwartungen ein PendingCommand. realArtisan() führt den Befehl aus und gibt den Exit-Code als Integer zurück. Tests müssen $mockConsoleOutput nicht mehr umschalten. PR #61588 behandelt die Helfer.

Der vollständige Changelog von 13.33.0 nennt zahlreiche weitere Korrektionen und Verbesserungen: Entfernung von restart_syscalls aus pcntl_signal in Worker, Anpassung beim Speichern von Passwort-Hashes für authentifizierte Sessions, Korrektionen für Enum-Schlüssel in tagged-cache many() und get(), Korrektur für Eloquent Collection duplicates() mit Schlüssel oder Callback, Verbesserungen bei Cloud-Job-Retries, Support für brick/math 0.20 und 1.0, health-start-period in Workflows, order() für DevCommands, EncodedParameter für RouteUrlGenerator, präzisere Werttypen für Collection::put(), relative Mercure-Hub-URLs, Serveroptionen für PostgreSQL-Verbindungen, MariaDB-11- und 12.3-Abdeckung in der CI, Protokolle valkey:// und valkeys://, Korrektur von SQLite-Schema-Dumps mit Shadow Tables, einheitliche Schreibweise in Docblocks, Composer-Flag --with-all-dependencies, Neubau des phpredis-Clients nach verlorenen Pipeline- oder Transaktionsverbindungen, --pretend bei install:broadcasting, frische Batches an BatchFinished- und BatchCanceled-Events, leere JSON-Arrays von route:list --json, Standard-Views für make:notification --markdown, Test-Suite-Verbesserungen, LazyCollection::take()-Fixes mit großen negativen Limits, Auslassung nicht erneut ausführbarer Batches in queue:retry-batch, Test-Konsolidierung und Ordering-Fixes, Respekt vor FILESYSTEM_DISK-Überschreibungen in Cloud-Konfigurationen, Unterstützung für Datenbank-Read-Replicas, optional natives PostgreSQL-Pooling, Handling nicht als String vorliegender Header in NotPwndVerifier, Redis-7.4-Cursorfehler-Fixes in Predis scan(), Query-Logging-Wiederherstellung nach fehlschlagenden Pretend-Callbacks, sole für Higher-Order-Proxies, createQuietly() und createManyQuietly() für BelongsToMany sowie Verbesserungen bei der Expression-Bindung in whereValueBetween().