Laravel 13.34.0 erschien am 30. September 2026. Die Version ändert das Fehlerverhalten von Queues und bringt weitere Anpassungen für ORM, Schema-Werkzeuge, Tests, Caches und Plattformintegrationen.
use Illuminate\Queue\Attributes\CountCrashesAsExceptions;
use Illuminate\Queue\Attributes\MaxExceptions;
#[MaxExceptions(3), CountCrashesAsExceptions]
class ProcessPodcast implements ShouldQueue
{
public function retryUntil(): DateTime
{
return now()->addHour();
}
}William Julian-Vicary hat das optionale Attribut CountCrashesAsExceptions für Queue-Jobs beigesteuert. Eine geworfene Exception wurde bereits auf den Wert von $maxExceptions angerechnet. Ein Worker, der wegen Out-of-Memory, eines Segmentation Faults oder eines gestoppten Containers endet, wurde bisher nicht als Exception gezählt. Ein Job mit retryUntil() und Rate Limiter konnte dadurch bis zum Ablauf seiner Frist immer wieder Worker zum Absturz bringen.
Das neue Attribut zählt einen abgestürzten Versuch als eine Exception. Die öffentliche Eigenschaft $countCrashesAsExceptions = true liefert dasselbe Verhalten. Beim Start eines entsprechend markierten Jobs schreibt der Worker einen Cache-Schlüssel und entfernt ihn nach dem Ende des Versuchs. Bleibt der Schlüssel beim nächsten Versuch bestehen, wertet Laravel den vorherigen Lauf als Worker-Absturz. Der Job muss maxExceptions setzen. Jeder Versuch erzeugt zwei zusätzliche Cache-Aufrufe, deshalb bleibt die Funktion standardmäßig deaktiviert. Die Änderung ist in Pull Request #61737 dokumentiert.
Jack Bayliss hat das Timeout-Verhalten für Jobs geändert, die Illuminate\Contracts\Queue\Interruptible implementieren. Erreicht ein Job sein Timeout, sendet der Worker nun SIGALRM. Die Methode interrupted() kann dadurch den Fortschritt speichern, bevor der Job fehlschlägt. Frühere Versionen übergaben bei anderen Unterbrechungen Signale wie SIGTERM. Bei einem Timeout konnte der Worker den Job jedoch beenden, ohne ihn vorher zu informieren.
Der Worker löst außerdem JobInterrupted aus. Dieses Ereignis wurde in Laravel 13.31 eingeführt. Exceptions aus interrupted() werden gemeldet, während das Timeout weiter greift. Die Änderung kam mit Pull Request #61651.
JobProcessed besitzt jetzt die Eigenschaft duration mit einer Angabe in Millisekunden. Stammt das Ereignis aus einem Worker, ist der Wert ein auf zwei Nachkommastellen gerundeter Float. Wird das Ereignis an anderer Stelle ausgelöst, ist der Wert null. Anwendungen müssen für die Laufzeitmessung nicht mehr zwingend JobProcessing und JobProcessed kombinieren. Pull Request #61672 fügte die Eigenschaft hinzu.
queue:flush akzeptiert nun --queue. Betreiber können damit fehlgeschlagene Jobs aus einer Queue löschen und die Fehler anderer Queues behalten. Zusammen mit --hours lässt sich das Alter begrenzen, etwa mit queue:flush --queue=sftp-sync --hours=48. Diese Erweiterung ist in Pull Request #61630 enthalten.
Schema::getColumn('users', 'email') liefert die Metadaten einer einzelnen Spalte. Das Ergebnis enthält unter anderem type_name und nullable. Für eine nicht vorhandene Spalte gibt die Methode ein leeres Array zurück. Pull Request #61759 ergänzte die Methode.
assertDatabaseCount() akzeptiert jetzt ein Array aus Tabellen- und Anzahlpaaren. Ein Test kann damit mehrere Eloquent-Modelle oder Tabellennamen in einer Assertion prüfen. Die Änderung steht in Pull Request #61727.
App::environment() und die environments()-Methode des Schedulers akzeptieren Enums. Das gilt auch für die Blade-Direktive @env, da sie über App::environment() kompiliert wird. Queue::isPaused() nimmt ebenfalls Enums an und entspricht damit Queue::pause() und Queue::resume(). Zuvor führte ein Enum in App::environment() zu einem Fehler. Ein Enum in environments() konnte verhindern, dass eine geplante Aufgabe ausgeführt wurde. Die Änderungen sind in #61730 und #61725 enthalten.
Relation::requireMorphMap() prüft nun auch die Leseseite polymorpher Relationen. Beim Speichern ohne Morph-Map-Eintrag warf Laravel bereits ClassMorphViolationException. Beim verzögerten oder vorgezogenen Laden löst ein nicht in der Map enthaltener *_type-Wert nun dieselbe Exception aus. Anwendungen ohne requireMorphMap() behalten ihr bisheriges Verhalten. Pull Request #61711 brachte diese Prüfung.
Die übrigen Änderungen von 13.34.0 betreffen Fehlerkorrekturen und Kompatibilität. LazyCollection-Werte funktionieren nun in between-Klauseln (#61678), und LazyCollection::combine() wirft bei unterschiedlichen Längen ValueError (#61696). Nach increment oder decrement werden aktualisierte Attribute mit dem Originalzustand synchronisiert. Beim Replizieren von Modellen werden solche Attribute ausgeschlossen (#61680, #61751). Number::parseInt() verarbeitet Werte oberhalb des 32-Bit-Bereichs. Number::format(), percentage() und currency() geben kein -0 mehr zurück (#61691, #61716). Collection::mode() behandelt Nullwerte korrekt (#61686), shift($count) liefert bei einer leeren Collection eine leere Collection (#61723), und trans_choice() wählt bei negativen Zahlen die richtige Pluralform (#61700).
PhpRedisLock::refresh() funktioniert mit aktivierter phpredis-Serialisierung (#61690). DatabaseLock verschluckt Deadlocks innerhalb einer Transaktion nicht mehr (#61708). sortBy() bewahrt bei mehreren Spalten und SORT_NUMERIC Nachkommastellen (#61699). Wiederholte Multipart-Anfragen behalten ihre angehängten Stream-Inhalte (#61728). Eloquent whereNot() erzeugt bei Array-Bedingungen keine doppelte Negation mehr (#61721). Relationsabfragen berücksichtigen den Owner-Key in whereMorphedTo() und whereNotMorphedTo() (#61712). wherePivotBetween() funktioniert nun mit sync(), detach() und updateExistingPivot() (#61747). through() liefert bei MorphMany keine HasOneThrough-Relation mehr (#61760). findOrFail() unterstützt Arrays mit Enum-IDs (#61765).
Die Ausgabe von queue:restart weist nun auf Worker hin, die nicht neu gestartet werden können (#61706). Laravel ergänzt Cloud-Exceptions (#61704), benannte S3-Credential-Provider und Cloud-IAM-Disks (#61676) sowie Unterstützung für phpstan/phpstan:2.2.15 (#61719). Bei gepooltem Cloud Postgres bleiben vorhandene PDO-Optionen erhalten, wenn emulierte Prepares erzwungen werden (#61735). Memcached-Locks mit einer Laufzeit von mehr als 30 Tagen laufen nicht mehr sofort ab (#61742). Redis-Throttling meldet keinen Zeitstempel mehr als Zahl der verbleibenden Versuche (#61748). Für createPayloadUsing am Queue-Manager kam ein Regressionstest hinzu (#61773).
Blades elsePushIf verarbeitet komplexe Bedingungen korrekt (#61741). ArrayStore::touch() behandelt Punkte in Schlüsseln wörtlich (#61777). memoized tagged-cache many() gibt für numerische Schlüssel nicht mehr null zurück (#61780). Dateiberichte enthalten den MIME-Typ (#61772). Validator-Ausschlüsse verwenden Zugriffe mit konstanter Laufzeit (#61698). Die Version enthält außerdem Markdown-Korrekturen (#61746), eine abschließende Mockery-Bereinigung (#61739), Dokumentations- und Testanpassungen (#61679, #61683, #61697, #61663) sowie StyleCI-Korrekturen (#61763).
CI-Workflows laufen nun unter Windows 2025. Ein instabiler Windows-Test für die Planung wurde korrigiert (#61718, #61768). Imagick wird für CI-Tests ausdrücklich aktiviert (#61756).




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.