Laravel 13.30 erschien am 2. September 2026 und umfasst neue Collection-Methoden, eine Härtung von Storage-Pfaden, Worker-Diagnosen und mehrere kleinere Fixes.

chunkBy() usage
$products->chunkBy('parent');

collect([1, 1, 2, 2, 1, 1])->chunkBy(fn ($value) => $value);
// [[1, 1], [2, 2], [1, 1]]

chunkBy() macht aus dem häufigsten chunkWhile()-Muster eine eigene Methode: Ein neuer Chunk beginnt, sobald sich der aufgelöste Wert eines Schlüssels oder Callbacks ändert. Weil der Schlüssel über data_get() aufgelöst wird, funktionieren auch Punktnotationen wie chunkBy('address.city'), und jeder entstehende Chunk behält seine ursprünglichen Array-Schlüssel. Beigesteuert von @JosephSilber in PR #61357.

Storage::path() überspringt die Pfadnormalisierung nicht mehr. Alle anderen Dateisystemaufrufe laufen durch den Flysystem-Treiber, der PathTraversalDetected wirft, sobald ein Pfad das Disk-Root verlässt. path() reichte den String bisher direkt an Flysystems PathPrefixer weiter: Auf der lokalen Standard-Disk lieferte path('../../../.env') einen nativen Pfad zur .env der Anwendung, während get() und delete() dasselbe Argument ablehnten. path() nutzt nun WhitespacePathNormalizer vor dem Prefixing; Code, der auf ..-Segmente vertraute, wirft jetzt eine Exception.

queue:work schreibt den Stop-Grund des Workers als letzte Zeile, etwa "Worker STOPPED Memory limit exceeded", und gibt unter --json einen strukturierten Datensatz mit level, status, reason, exit_code, jobs_processed, memory und timestamp aus. Das Enum WorkerStopReason erhielt eine description()-Methode für neun Exit-Szenarien, von interrupted bis job timed out. Unter --quiet oder --silent wird nichts geschrieben.

DevCommands erhält zwei optionale Filter: withoutVendorCommands() entfernt aus vendor/ registrierte Befehle, withoutDefaultCommands() die Framework-Defaults (serve, queue:listen, pail, Vite). Anwendungseigene Befehle bleiben unberührt; gefiltert wird über denselben Herkunftswert, den DevCommands bereits für Namenskollisionen nutzte.

Native sqlsrv:-DSN-Verbindungsstrings für Microsoft SQL Server werden jetzt vor dem URL-Parsing erkannt und von einem eigenen Parser verarbeitet, der Host, Port, Datenbank und PDO_SQLSRV-Optionen wie Encrypt, TrustServerCertificate, MultiSubnetFailover, ApplicationIntent und LoginTimeout ausliest. Bisher interpretierte parse_url() den gesamten DSN als Pfad und beschädigte die Konfiguration. Die Konvention sqlsrv://user:pass@host:port/database funktioniert weiter.

Artisan::commandNamed('app:my-command') liefert eine einzelne Command-Instanz oder null, ohne alle registrierten Befehle zu instanziieren, anders als Artisan::all(). Die Laravel-Cloud-Queue implementiert totalPendingSize(), totalDelayedSize() und totalReservedSize() als Summe über managedQueues(); SQS liefert dort 0, da es Queues nicht aufzählen kann.

Zu den Fixes zählen: route:cache stellt die Facade-Application nach dem Bootstrap der Wegwerf-Kopie wieder her (zuvor zeigten Facades auf einen verworfenen Container, was unter php artisan optimize eine LogicException auslöste), Request::clamp() fällt bei nicht-numerischen Werten auf den Default zurück statt einen 500er zu werfen, db:seed stellt die Default-Verbindung per try/finally wieder her, setVisibility() nutzt auf Read-Through-Disks readerFor(), Queue::createPayloadUsing() benötigt keine aufgelöste Verbindung mehr, Tooltips auf der Exception-Seite rendern standardmäßig mit allowHTML: false, verschachtelte JSON:API-Include-Pfade lösen auf der richtigen Ebene auf, spl_object_id() ersetzt spl_object_hash() in Container und Eloquent-Builder, und ein Fix für quadratische Wildcard-Regel-Expansion wurde auf 12.x zurückportiert.