What's New in Laravel 13.16.0
Laravel 13.16.0 landed on June 17, 2026 with a handful of developer-experience improvements. Here is a breakdown of every notable addition.
The php artisan dev Command
The headline feature is a new php artisan dev command that starts your development processes—server, queue worker, log tailing, and Vite—concurrently in a single terminal. Its default behavior mirrors the existing composer dev script, but configuration now lives in your application code rather than composer.json.
Register commands through the DevCommands class, typically inside a service provider:
use Illuminate\Foundation\Console\DevCommands;
DevCommands::artisan('reverb:start');
DevCommands::register('stripe listen --forward-to ' . config('app.url'));
You can name a process explicitly and assign a terminal color:
DevCommands::artisan('reverb:start', 'reverb')->orange();
DevCommands::register('stripe listen --forward-to ' . config('app.url'))->green();
Packages inside vendor cannot register commands automatically, keeping the list under your control. A companion NodePackageManager helper detects the correct package manager (npm, yarn, pnpm, or bun) from the lockfiles present, so generic commands resolve to the right runner.
Note: Upgrade to v13.16.1, which contains a bug fix for registering the
artisan devcommand.
whenFilledEnum() on Requests
The InteractsWithData trait gains a whenFilledEnum() method that converts a request value to a backed enum before invoking a callback. It replaces the manual whenFilled() → tryFrom() → null-check pattern:
$request->whenFilledEnum('status', Status::class, function (Status $status) use ($query): void {
$query->where('status', $status);
});
The callback fires only when the key is present, the class is a backed enum, and tryFrom() returns a valid case. Invalid values are silently skipped. An optional second callback runs as a fallback:
$request->whenFilledEnum(
'status',
Status::class,
fn (Status $status) => $query->where('status', $status),
fn () => $query->where('status', Status::Active)
);
withCookies() on All Responses
withCookies() has been promoted from RedirectResponse to ResponseTrait, making it available on every response type including JsonResponse:
return response()->json($data)->withCookies([$cookieA, $cookieB, $cookieC]);
The change is fully additive and non-breaking.
Array Maintenance Mode Driver
A new array driver joins the existing file and cache drivers for maintenance mode. It targets parallel testing scenarios where the file driver or Cache facade mocking can interfere with php artisan up and down calls.
Other Notable Changes
- Enums in
broadcastAs()— broadcast events can now return an enum for the event name, keeping names consistent across sender and receiver. - JSON Schema
anyOfsupport — plus a guard against unbounded$refexpansion to prevent runaway recursion in the deserializer. - Fixed shell quoting when scheduled commands run as another user.
- Added support for queue attributes on traits.
- Improved return types across model scopes, connection callbacks, and callback-passthrough helpers.
Key Takeaways
php artisan devcentralizes concurrent dev-process management inside your app code.whenFilledEnum()removes boilerplate when filtering requests by backed enum values.withCookies()is now available on any response, not just redirects.- The
arraymaintenance mode driver makes parallel test suites more reliable. - Upgrade to v13.16.1 to pick up the
artisan devregistration fix.
Source: Laravel News — The artisan dev Command in Laravel 13.16.0