The Laravel team released v13.32.0 with a new Mercure broadcast driver, copyToDisk() and moveToDisk() methods on the filesystem, enum support in queue pause and resume, and more:
Mercure Broadcast Driver
Kévin Dunglas contributed a broadcast driver for Mercure, a real-time protocol that runs over SSE instead of WebSockets:
// config/broadcasting.php'mercure' => [ 'driver' => 'mercure', 'url' => env('MERCURE_URL'), 'public_url' => env('MERCURE_PUBLIC_URL'), 'secret' => env('MERCURE_JWT_SECRET'), 'encryption_key' => env('MERCURE_ENCRYPTION_KEY'),],
With FrankenPHP, the built-in hub needs no url or secret. The driver also supports presence channels and end-to-end encrypted private-encrypted-* channels. A companion Echo patch adds client support.
See #61474 and the broadcasting installer support in #61587 for more details.
Storage copyToDisk() and moveToDisk()
Jack Bayliss contributed copyToDisk() and moveToDisk() to FilesystemAdapter, replacing the manual read-stream-then-write-stream pattern for moving files between disks:
// Copies to the backup disk, retaining the file on the local diskStorage::disk('local')->copyToDisk('backup', 'reports/report.csv'); // Copies to the backup disk, deleting the file from local diskStorage::disk('local')->moveToDisk('backup', 'reports/report.csv'); // Specify a different destination pathStorage::disk('local')->copyToDisk('s3', 'reports/report.csv', '2026/report.csv');
A follow-up PR lets you pass a filesystem instance instead of a disk name.
See #61511 for more details.
Enums in Queue Pause and Resume
Jack Bayliss contributed enum support for Queue::pause(), Queue::resume(), and Queue::pauseFor(), matching the enum support already available on job Queue/Connection attributes and manager methods like route() and forward():
Queue::pause(Queues::notifications, Connections::Redis);Queue::resume(Queues::notifications, Connections::Redis);Queue::pauseFor(Queues::notifications, Connections::Redis, 60);
See #61464 for more details.
Release Notes
You can see the complete list of new features and updates below and the diff between 13.31.0 and 13.32.0 on GitHub. The following release notes are directly from the changelog:
v13.32.0
- [12.x] Default memoryExceededExitCode for Cloud by @jackbayliss in #61432
- Wrap the closure return type in
withFreshQueryLog()by @SanderMuller in #61458 - Wrap the autocompleter callback return type in
askWithCompletion()by @SanderMuller in #61487 - [13.x] Allow enums in queue pause/resume methods by @jackbayliss in #61464
- [13.x] Compare lowercased index names in hasIndex by @dwjordan in #61506
- [13.x] Fix containsStrict() returning false when a closure matches a null value by @bunyaminbilenkaratas in #61507
- [13.x] Pass the exception to Eloquent violation callbacks by @jackbayliss in #61504
- [13.x] Change unused variables to named arguments by @imanghafoori1 in #61513
- [13.x] Update SupportBinaryCodecTest by @jackbayliss in #61512
- [13.x] Fix Factory::raw() with a count of zero by @OpadaAlzaiede in #61510
- [13.x] Add missing implementation for
SessionHandlerInterfacefor PHP 9 by @crynobone in #61517 - [13.x] Add copyToDisk & moveToDisk to FilesystemAdapter by @jackbayliss in #61511
- [13.x] Add a Mercure broadcast driver by @dunglas in #61474
- [13.x] Accept filesystem instance in
copyToDisk()andmoveToDisk()methods by @ziadoz in #61519 - [13.x] Fix Str::password() returning extra characters and throwing validation errors by @bunyaminbilenkaratas in #61521
- [13.x] Fix Str::camel() not lowercasing multibyte first characters by @rayblair06 in #61545
- [13.x] Fix collapseWithKeys() crashing when the outer collection has string keys by @rayblair06 in #61539
- [13.x] Fix TypeError in SessionGuard::userFromRecaller() when getAuthPassword() is null by @irabbi360 in #61532
- Strengthen mocked tests with the real thing by @jasonmccreary in #61563
- [13.x] Fix appendToPriorityList() when the referenced middleware is the first item by @GabeSilvaDev in #61567
- [13.x] Improve collection return types for methods that mutate by @axlon in #61571
- [13.x] Add
isManagedQueueto CloudManager by @jackbayliss in #61568 - [13.x] Fix Redis tagged cache not syncing tag entry expiration on touch by @Ashot1995 in #61574
- [13.x] Decode job payload once by @jackbayliss in #61526
- [13.x] Fix
sum()return type when the key matches a global function name by @crishoj in #61578 - [13.x] Add UnitEnum to Authorizable contract by @hosni in #61589
- [13.x] Add support for installing Mercure via broadcasting install command by @Lea-Bar in #61587
- [13.x] Preserve unchanged values when encrypting readable environment files by @mathiasgrimm in #61503