Laravel 13.42 shipped on November 10, 2026, without much fanfare, but with four additions that teams running production applications will notice quickly: typed reads of UUIDs and ULIDs from request data, an event fired when a migration fails, and an explicit reason attached to every skipped scheduled task. No breaking changes come with this minor 13.x release.
Reading a UUID or ULID From the Request Without Boilerplate
Until now, pulling a UUID out of request input meant calling Uuid::fromString() and manually checking for a missing value. The new uuid() and ulid() methods on the InteractsWithData trait do both in one call, and are available on Request, Fluent, ValidatedInput, UriQueryString, ComponentAttributeBag, and CommandInput.
$request->uuid('order_id'); // Ramsey\Uuid\UuidInterface|null
$request->ulid('order_id'); // Symfony\Component\Uid\Ulid|null
$request->safe()->uuid('order_id');Missing or empty input returns null in both cases; an invalid value throws rather than letting a malformed string through. For ulid(), the team deliberately chose new Ulid($value) over Ulid::fromString(), since the latter also accepts other formats and could silently convert a UUID into a different ULID.
| Addition | Pull request | Scope |
|---|---|---|
uuid() method | #62327 | InteractsWithData trait, six classes affected |
ulid() method | #62348 | Same trait, a logical follow-up |
MigrationFailed event | #62342 | Migrator, fired before the exception is rethrown |
ScheduledTaskSkipReason | #62294 | ScheduledTaskSkipped event, new reason property |
An Event to React When Migrations Fail
The MigrationFailed event wraps each migration in a try/catch block: on failure, the event fires and the exception then continues on its normal path. The feature’s author pointed to MySQL ALTER statements, which cannot be rolled back: a failed deployment can leave the database partially altered, and this signal lets a team react before someone discovers it by hand.
On MySQL, an ALTER statement that fails mid-migration leaves the database partially altered with no rollback path — the new MigrationFailed event finally gives teams a hook to react right away.
Event::listen(function (MigrationFailed $event) {
Artisan::call('down');
Queue::pauseAll();
Log::channel('slack')->critical("Migration [{$event->name}] failed on ".config('app.name'), [
'exception' => $event->exception->getMessage(),
]);
});ScheduledTaskSkipped (ScheduledTaskSkipReason) answers a recurring complaint: knowing why a scheduled task didn’t run, without digging through logs by hand. Useful for telling an overlap, a maintenance window, or a server that simply isn’t holding the lead apart.No Rush, but Worth Knowing About
Nothing in this release forces an immediate upgrade: these are additive features, not security fixes. The usual command is enough to pick them up on an existing 13.x project.
composer update laravel/framework
php artisan --versionThe Same Discipline as Runtime Maintenance
This kind of minor release mirrors a discipline also seen on the runtime side: Node.js’s November 11 security release is a reminder that maintaining a backend stack isn’t only about security patches — it also covers these small conveniences that chip away at technical debt over time. Teams that were already tracking 13.40’s queue-monitoring additions will recognize the same instrumentation logic here, this time applied to migrations and the scheduler.
Key Takeaways
Laravel 13.42 is no major milestone, but its four additions — typed UUID and ULID reads, a failed-migration event, a skip reason for scheduled tasks — each address a concrete irritant teams have already hit in production. A low-risk upgrade, worth scheduling into the next maintenance cycle rather than rushing out.
This is exactly the kind of release many teams skip past for lack of a flashy changelog — and that’s a mistake. On a client project, I once lost over an hour tracking down why a scheduled task was skipping every other day, before realizing it simply overlapped its previous run. An event with an explicit reason would have solved that in five minutes. — Simon Janvier
Further reading: the full pull request list is available on the laravel/framework GitHub repository.
