This week, the Laravel team released v10.31, the ability to place batches within job chains. You can run jobs sequentially, then parallelize a batch of jobs, and continue with the chain once that batch has been completed.
Allow placing a batch on a chain
Sebastien Armand added the ability to run batches of jobs within a job chain
This is a use case we encounter in a couple places at Square where we have a serial process of jobs that need to be handled and one or more of the steps either should be worked on in parallel or are of unknown length when initially triggering the workflow and will create additional jobs, but we need to know when this is finished to ensure we keep the chain going.
Here's an example from the updated Chains & Batches documentation, where you could first flush the cache, release a batch of podcasts, and then batch notifications of those podcasts:
use App\Jobs\FlushPodcastCache;use App\Jobs\ReleasePodcast;use App\Jobs\SendPodcastReleaseNotification;use Illuminate\Support\Facades\Bus; Bus::chain([ new FlushPodcastCache, Bus::batch([ new ReleasePodcast(1), new ReleasePodcast(2), ]), Bus::batch([ new SendPodcastReleaseNotification(1), new SendPodcastReleaseNotification(2), ]),])->dispatch();
Sleep::until() handles string timestamps
James Hulse contributed the ability to pass a timestamp string to Sleep::until()
, which will still ensure the value is numeric:
Sleep::until("1699411804");
Sec-Purpose
header
Added support for @nanos contributed support for the Sec-Purpose header when relying on the $request->prefetch()
method:
Whilst most User Agents set Purpose: prefetch in prefetch requests, Firefox uses Sec-Purpose: prefetch in the latest version, as described in the above MDN article. This means that calling the ->prefetch() method on the request will return false for requests sent via the Firefox browser, regardless of prefetch status.
Release notes
You can see the complete list of new features and updates below and the diff between 10.30.0 and 10.31.0 on GitHub. The following release notes are directly from the changelog:
v10.31.0
- [10.x] Allow
Sleep::until()
to be passed a timestamp as a string by @jameshulse in https://github.com/laravel/framework/pull/48883 - [10.x] Fix whereHasMorph() with nullable morphs by @MarkKremer in https://github.com/laravel/framework/pull/48903
- [10.x] Handle
class_parents
returning false inclass_uses_recursive
by @RoflCopter24 in https://github.com/laravel/framework/pull/48902 - [10.x] Enable default retrieval of all fragments in
fragments()
andfragmentsIf()
methods by @tabuna in https://github.com/laravel/framework/pull/48894 - [10.x] Allow placing a batch on a chain by @khepin in https://github.com/laravel/framework/pull/48633
- [10.x] Dispatch 'connection failed' event in async http client request by @gdebrauwer in https://github.com/laravel/framework/pull/48900
- authenticate method refactored to use null coalescing operator by @miladev95 in https://github.com/laravel/framework/pull/48917
- [10.x] Add support for Sec-Purpose header by @nanos in https://github.com/laravel/framework/pull/48925
- [10.x] Allow setting retain_visibility config option on Flysystem filesystems by @jnoordsij in https://github.com/laravel/framework/pull/48935
- [10.x] Escape forward slashes when exploding wildcard rules by @matt-farrugia in https://github.com/laravel/framework/pull/48936
Edit 11/09/2023: The Bus::chain()
snippet originally contained an incorrect ->then()
chain. This article has corrected the error and it was also fixed upstream in the official docs.