Laravel 13.25 provides a worldwide pause change that stops each queue on each reference to one command, replaces the method runner behind artisan dev with a tabbed terminal UI, and lets an Picture occasion be returned straight from a route. The Laravel group launched v13.25.0 on August 11, 2026.
queue:pause --allandqueue:resume --all, plusQueue::pauseAll()andQueue::resumeAll()artisan devruns by@laravel/multiplexwith tabs, stream, and inline modesPictureimplementsResponsable, good pointsPicture::fromStream(), andtoFormat()is now public- A
UniqueJobSkippedoccasion, the timeout worth onJobTimedOut, and fail-on-timeout for notifications withoutCookies()on responses and aforeignUlidFor()schema helperRequest::all()now prefers enter over recordsdata when the 2 collide
What’s New
Pause Each Queue on Each Connection
Laravel has been capable of pause a person queue for some time, however the granularity labored in opposition to you throughout a deployment. An utility with a dozen employees unfold over a number of named queues needed to pause every connection and queue pair by title, and people names change as options come and go. Reaching for upkeep mode as an alternative takes the entire web site down when all you wished was for employees to cease reserving jobs.
Each console instructions now take an --all flag:
php artisan queue:pause --all
php artisan queue:resume --all
The queue argument grew to become optionally available to make room for it, and the identical change is offered on the facade:
use IlluminateSupportFacadesQueue;
Â
Queue::pauseAll();
Queue::resumeAll();
The worldwide change is a single cache key that employees examine alongside the per-queue keys, so isPaused() and getPausedQueues() report a queue as paused when both change is on. The 2 are impartial: resumeAll() clears the worldwide flag and leaves something you paused individually nonetheless paused, which is deliberate so a deploy script can’t by chance restart a queue any person parked on objective.
Two new occasions, QueuesPaused and QueuesResumed, hearth alongside the present per-queue QueuePaused and QueueResumed. Contributed by @jackbayliss in #61126.
Learn extra: Pause All Laravel Queues Throughout a Deploy
artisan dev Runs By means of @laravel/multiplex
The artisan dev command shelled out to concurrently, which interleaves each course of into one scrolling feed. A Vite rebuild and a queue employee and Pail all writing without delay makes discovering the road you care a couple of scrolling train.
It now runs by @laravel/multiplex, a terminal UI with every course of in its personal tab, search, per-process restart and log clearing, and automated restart of a course of that crashes. Three modes can be found, tabs (the default), stream (one interleaved feed you possibly can scroll and search), and inline (plain output, used mechanically when there isn’t a TTY). Decide one per run:
php artisan dev --stream
php artisan dev --timestamps --no-restart
Or set the default for the challenge in a service supplier:
use IlluminateFoundationDevCommands;
Â
DevCommands::stream();
DevCommands::withTimestamps();
DevCommands::disableAutoRestart();
DevCommands::bufferSize(5000);
When the command exits, the buffered logs are printed to the primary terminal so nothing is misplaced on the best way out. Home windows falls again to concurrently, since multiplex presently helps macOS and Linux solely, and the Node flooring for the brand new path is v22.13. The total listing of modes, flags, and registration strategies is in the artisan dev terminal UI. Contributed by @joetannenbaum in #61100.
Photos as HTTP Responses
The first-party picture API may rework a picture and retailer it, however handing one again over HTTP meant calling toBytes() and assembling the response your self. Picture now implements Responsable, so a route can return the occasion:
use IlluminateSupportFacadesImage;
Â
Route::get('/avatars/{consumer}', perform (Person $consumer) {
return Picture::fromStorage($consumer->avatar_path)
->cowl(200, 200)
->toWebp()
->high quality(80);
});
toResponse() returns a 200 with the processed bytes and a Content material-Kind learn from the output, so the header matches no matter format the pipeline produced quite than the supply file.
Two smaller additions in the identical space. Picture::fromStream() builds an occasion from a stream useful resource, studying it lazily and throwing an ImageException if the stream yields nothing:
$picture = Picture::fromStream(Storage::disk('s3')->readStream($path));
And toFormat() is now public, which replaces the match assertion you’d in any other case write to show a user-supplied format string into the suitable toWebp() or toAvif() name:
return Picture::fromUpload($request->file('picture'))
->toFormat($request->string('format'))
->high quality(80);
An unsupported format throws an ImageException quite than falling by. All three contributed by @calebdw in #61111, #61109, and #61110.
Queue Observability Additions
A job that’s not dispatched as a result of a ShouldBeUnique lock is held disappears with out a hint, which makes it laborious to inform a working uniqueness constraint from a lock that’s by no means launched. The brand new UniqueJobSkipped occasion carries the job that was dropped:
use IlluminateQueueEventsUniqueJobSkipped;
Â
Occasion::hear(perform (UniqueJobSkipped $occasion) {
Log::data('Skipped distinctive job', ['job' => $event->job::class]);
});
It fires from PendingDispatch when the distinctive lock can’t be acquired, alongside the present JobDebounced occasion (#61039).
JobTimedOut gained a 3rd property, $timeout, holding the variety of seconds that was exceeded. A employee began with queue:work --timeout=120 applies its personal timeout to each job it runs, so with out the worth on the occasion there was no method to inform a job’s personal timeout from the employee’s (#61060).
Notifications now honor fail-on-timeout. SendQueuedNotifications reads a $failOnTimeout property or a #[FailOnTimeout] attribute off the notification, which issues when a timeout leaves you uncertain whether or not a 3rd social gathering already delivered the message (#61072):
use IlluminateQueueAttributesFailOnTimeout;
Â
#[FailOnTimeout]
class OrderShipped extends Notification implements ShouldQueue
{
//
}
Lastly, QueueFake now assigns a uuid to faked jobs, so the queue inspection strategies return the identical form they do in opposition to an actual driver and utility code that reads $job->uuid is testable (#60966).
withoutCookies() on Responses
Expiring a number of cookies meant chaining withoutCookie() as soon as per title. The plural type takes an array:
return response('OK')->withoutCookies(['session', 'tracking', 'preferences']);
It loops over withoutCookie(), so the optionally available $path and $area arguments apply to each cookie within the array, and cookie cases work in addition to names. Contributed by @xurshudyan in #61115.
foreignUlidFor() Schema Helper
foreignIdFor() already detects the HasUlids trait and produces a ULID column, however there was no express helper to match foreignUuidFor(). The trio is now full:
$desk->foreignUlidFor(Person::class)->constrained();
The helper infers the column title, the associated desk, and the referenced key from the mannequin, producing a char(26) column and the matching overseas key constraint. Contributed by @talaridisTh in #61036.
Request::all() Prefers Enter Over Recordsdata
Request::all() merged the enter bag and the file bag with array_replace_recursive(), with recordsdata utilized final, so a file area and an enter area sharing a reputation resolved to the UploadedFile. The order is now reversed, and enter wins:
// POST with enter electronic mail=taylor@laravel.com and a file additionally named electronic mail
$request->all(); // ['email' => 'taylor@laravel.com']
$request->electronic mail; // 'taylor@laravel.com'
$request->file('electronic mail') // nonetheless the UploadedFile
Nested keys merge the identical means, so a profile.avatar file and a profile.title enter nonetheless each seem, with enter taking priority solely the place the keys really collide. file() is unaffected. Contributed by @taylorotwell in #61099.
Different Fixes and Enhancements
Http::globalOptions()and world middleware have been utilized to the framework’s personal cloud agent unix socket lengthy ballot, the place an choice likeforce_ip_resolve => v4breaks the socket connection. A brand newManufacturing facility::withoutGlobalConfiguration()closure isolates agent site visitors from application-level consumer configuration (#61064, #61068)- Queued broadcast occasions misplaced the
truedefault for$deleteWhenMissingModels, so a mannequin deleted earlier than the employee picked up the job failed with aModelNotFoundExceptionas an alternative of being discarded (#61074) Gate::forUser()copied skills, insurance policies, and callbacks however not the configured default denial response, so a gate arrange withResponse::denyAsNotFound()fell again to the framework default (#61087)Str::substrReplace()threw aTypeErroron array arguments after the multibyte rewrite handed them straight tomb_substr(). Array calls now delegate to PHP’s nativesubstr_replace()(#61105)- Backed enum queue names are revered when queueing mailables (#61066), queue drivers match the pretend for enum queue names (#61116),
MailFakepreserves queue decision on queued mailables (#61114), and bulk pushes toDatabaseQueuerespect after-commit dispatch (#60996) - Deactivating cache-backed upkeep mode between the middleware’s two cache lookups threw a
TypeError; the middleware now rechecks the state the identical means it already did for the file driver (#61121) Container::nameleft entries on the construct stack when a dependency threw, so later resolutions noticed a stale stack (#61041)- Typed cache getters interpolated an enum key into the sort mismatch message, producing an
Erroras an alternative of the supposedInvalidArgumentException(#61056) - HEIC recordsdata reported incorrect dimensions (#61010),
LazyCollection::flip()skips values that can not be array keys (#61081), and#[WithoutTimestamps]is checked when a mannequin decides whether or not to the touch (#61073) - Retry callbacks on asynchronous HTTP requests obtain the HTTP technique as a 3rd argument, matching synchronous requests, which beforehand brought on an
ArgumentCountError(#61106) - Non-stream sources are rejected in HTTP pretend response our bodies (#61047), the Cloud log driver units a socket timeout (#61065, #61082), and signed URL assist was adjusted for Vapor (#61129)
schedule:listingconverts timezones accurately for vary, step, and wildcard cron expressions (#60913),Manufacturing facility::insert()handles a rely of zero (#60911), and a failure whereas logging a deprecation not escalates to a deadly error (#60907)- Kind annotation fixes for
Arr::prependKeysWith()(#61034),Str::numbers()(#61053),getMigrationBatches()(#60973),getRememberToken()(#61067), the route binding registrar (#61124), andColumnDefinition::unsigned()(#61123) - Help for
brick/math^0.19 (#61133)
References

