Skip to content

The publication for web craftspeople Thursday, 12 November 2026

Back-end

Laravel 13.42 Adds Typed UUID and ULID Reads and a Failed-Migration Event

Laravel 13.42, released on November 10, 2026, adds uuid() and ulid() methods for reading request input, a MigrationFailed event, and a detailed reason for skipped scheduled tasks. Small additions that save backend teams from writing the same boilerplate again.

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.

AdditionPull requestScope
uuid() method#62327InteractsWithData trait, six classes affected
ulid() method#62348Same trait, a logical follow-up
MigrationFailed event#62342Migrator, fired before the exception is rethrown
ScheduledTaskSkipReason#62294ScheduledTaskSkipped 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(),
    ]);
});
The reason attached to 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 --version

The 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.

Read next