Das Laravel-Team hat v13.26.0 am 18. August 2026 veröffentlicht. Wichtigste Neuerung ist ein Read-Through-Filesystem-Treiber, der eine primäre Disk über eine Fallback-Disk legt. Lesevorgänge prüfen zuerst den Primary, greifen sonst auf den Fallback zu und kopieren die Datei dabei in den Primary, der sich so nur mit tatsächlich angefragten Dateien füllt. Schreiben, Löschen und Listings gehen nur an den Primary. Mit copy => false wird direkt vom Fallback ausgeliefert, etwa wenn eine Entwicklungsumgebung auf Produktivdateien zeigt. Fehler beim Kopieren werden standardmäßig ignoriert; throw_on_promotion_failure => true macht sie sichtbar. Beigesteuert von @taylorotwell in #61140, die No-Copy-Option von @jimbojsb in #61155.
Das #[DebounceFor]-Attribut, in Laravel 13.6 für Jobs eingeführt, funktioniert jetzt auch auf queued Event-Listenern. Feuert dasselbe Event mehrfach, läuft nur die letzte Dispatch innerhalb des Fensters. Eine debounceId()-Methode begrenzt das Fenster pro Ressource, maxWait deckelt, wie lange ein dichter Strom die Arbeit aufschieben darf. Das Debouncing gilt pro Listener; andere Listener desselben Events laufen weiterhin jedes Mal. Ein gedebouncter Listener darf nicht zugleich ShouldBeUnique implementieren, sonst wirft der Dispatcher eine LogicException. Beitrag von @stevebauman in #61169.
Queue::forward() leitet alles, was auf eine Queue dispatched wird, auf eine andere Queue, eine andere Connection oder beides um. Die Konfiguration steht einmal in einem Service Provider, Job-Klassen und Dispatch-Stellen bleiben unverändert. Forwards laufen über denselben Hook wie Queue::route() und greifen unabhängig davon, wie der Job die Queue erreicht. Beitrag von @jackbayliss in #61188.
Drei Process-Verbesserungen stammen von @xurshudyan. Process-Pools und ihre Ergebnisse implementieren nun IteratorAggregate (#61184); bisher iterierte foreach über ProcessPoolResults öffentliche Eigenschaften, von denen es keine gibt, sodass eine Schleife zum Prüfen von Exit-Codes still nichts prüfte. Ein Idle-Timeout wirft jetzt eine eigene ProcessIdleTimedOutException statt ProcessTimedOutException (#61182) und trennt einen hängenden von einem langsamen Prozess. Das Process-Fake erhielt assertRanCount(), assertRanInOrder() und einen recorded()-Filter mit Callback (#61193, #61197); Zähl- und Reihenfolge-Assertions akzeptieren auch Array-Kommandos.
Eloquent erhielt orWhereKey() und orWhereKeyNot() als Ersatz für den orWhereIn('id', ...)-Umweg (@calebdw, #61154). wherePivot() und orWherePivot() akzeptieren jetzt eine Closure, die einen auf das Pivot-Modell begrenzten Builder erhält, sodass Scopes einer eigenen Pivot-Klasse nutzbar sind (@calebdw, #61150). inOrderOf() nimmt Enums in der Werteliste an (@ziadoz, #61147), und Relationen bieten einen getRelatedClass()-Accessor (#61222).
Bei der Queue-Worker-Sichtbarkeit gibt es Neues: Ein JobReleased-Event feuert, wenn ein Job aus seinem Handler oder aus Middleware wie WithoutOverlapping zurück auf die Queue gelegt wird; das bisherige JobReleasedAfterException deckte nur Releases nach einem Throw ab (#61108). Worker geben außerdem einen Hinweis aus, wenn eine konsumierte Queue pausiert ist und wieder aufgenommen wird (#61142). Beides von @jackbayliss.
Weitere Änderungen: Guzzle 8 wird neben Guzzle 7 unterstützt (#60321). db:seed --class=SpecificSeeder zeigt dieselbe RUNNING/DONE-Ausgabe wie verschachtelte Seeder (#61186). Redis wurde gehärtet: Paused-Queue-Checks vermeiden Cross-Slot-Reads auf Clustern, Cache-Tag-Pruning scannt alle Master-Nodes und loopt nicht mehr endlos bei veralteten Tags, fehlgeschlagene Pipelines lassen die Verbindung nutzbar, der phpredis-Client wird nach Cluster-Fehlern neu aufgebaut, einige Kommandos wiederholen transiente Fehler. Der Cloud-Queue-Treiber exponiert managedQueues(), Managed-Queue-Events heben verschachtelte Daten hoch, und abgelaufene Cloud-Agent-Long-Polls werden wiederholt. throwUnless() tut nicht mehr still nichts, Request-Input-Key-Reihenfolge bleibt beim Mergen von Dateien erhalten, SQL Server respektiert readonly=false, Postgres-JSON-Pfadattribute escapen einfache Anführungszeichen, und Array-JSON:API-Parameter verursachen keinen TypeError mehr. pail wird nur registriert, wenn Pail installiert ist, artisan dev fragt nicht mehr wiederholt nach @laravel/multiplex, Session-Fehler behalten die ursprüngliche Assertion-Meldung, ein setTestNow()-Problem mit now() wurde behoben, und expectsQuestion() erlaubt Array-Antworten.
Breaking Changes sind für typische Anwendungen nicht zu erwarten. Zwei Randfälle: Ein Listener mit #[DebounceFor] wirft eine LogicException, wenn er zugleich ShouldBeUnique implementiert, und die Interna von whereKey()/whereKeyNot() wurden in #61154 konsolidiert, relevant nur, wenn man den Eloquent-Builder erweitert und diese Methoden überschreibt.
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.