See everything we announced at Laracon US 2025. Read the blog post
Skip to content

Changelog

New updates and improvements to Laravel’s open source products.

July 2025

Laravel Framework 12.x

Added Verbose Output for queue:work

Pull requests by @seriquynh & @amirhshokri

1php artisan queue:work --verbose
2// App\Jobs\UrgentAction 85 high
3// App\Jobs\NormalAction 84 default

With --verbose, you’ll now see queue names alongside each job and job ID, making multi-queue debugging straightforward and saving you time when tracing issues.

Uri Implements JsonSerializable

Pull request by @devajmeireles

1echo json_encode(new Uri('/path?x=1'));
2// "http://localhost:8000/path?x=1"

This release fixes a serialization bug, properly converting the URI to a string when serializing a larger JSON object that contains the URI as a value.

Added doesntStartWith() & doesntEndWith()  Str Methods

Pull request by @balboacodes

1str('apple')->doesntStartWith('b'); // true
2str('apple')->doesntEndWith('e'); // false

The inverse of startsWith/endsWith, these new methods allow you to fluently test for starting and ending characters in your string.

Closure Support in pluck()

Pull request by @ralphjsmit

1$users->pluck(fn($u) => $u->email, fn($u) => strtoupper($u->name));

You can now dynamically generate keys and values via callbacks. Instead of mapping then plucking, you get a single, flexible method that reduces steps and keeps intent clear.

Pint

Added --parallel Option

Pull request by @nunomaduro

1./vendor/bin/pint --parallel

By leveraging PHP CS Fixer’s parallel runner, Pint now formats files concurrently. On large codebases that once took minutes, you’ll see results in seconds, speeding up both local workflows and CI pipelines for a clear quality of life win.

Telescope

Migrated to Vite

Pull request by @nckrtl

Telescope’s frontend now uses Vite instead of Mix. Asset builds finish faster, hot-reloads are more reliable, and you benefit from a modern toolchain without changing your workflow.

Octane

FrankenPHP’s File Watcher

Pull request by @kohenkatz

Octane now relies on FrankenPHP’s native file watcher for reloading the server on file changes. This removes the NodeJS dependency and eases the local development process significantly.

Inertia

Reset Form State and Clear Errors with a Single Method

Pull request by @pascalbaljet

1const form = useForm({ name: "", email: "" });
2 
3// Instead of:
4form.reset();
5form.clearErrors();
6 
7// You can now:
8form.resetAndClearErrors();

You can now concisely reset all fields and errors in one go, bringing your form back to square one.

Prevent Minifying JavaScript Builds and Test Apps

Pull request by @pascalbaljet

Inertia no longer distributes minified builds, aligning it with the strategy of other popular libraries. This makes debugging more straightforward and allows for local patching if the need arises.

June 2025

Laravel Framework 12.x

Added encrypt() and decrypt() String Helper Methods

Pull request by @KIKOmanasijev

You can now chain encrypt() and decrypt() directly on a Str instance, so instead of piping your string through separate encryption calls, you can write:

1$value = Str::of('secret')->encrypt()->prepend('Encrypted: ');
2$original = Str::of($value)->decrypt();

This keeps your string-manipulation chains concise (no need to write separate, extra code to handle encryption) and you don’t have to manually wrap a value in encryption calls each time.

Learn more about encrypt and decrypt

Added broadcast_if() and broadcast_unless() Utilities

Pull request by @taylorotwell

You now have two methods for conditional broadcasting in a single call:

1broadcast_if($order->isPaid(), new OrderShipped($order));
2broadcast_unless($user->isActive(), new InactiveUserAlert($user));

This replaces multi-line conditionals around broadcast() and makes your event logic more readable, improving the overall developer experience.

Read the docs about event broadcasting in Laravel

Added --batched Flag to make:job

Pull request by @hafezdivandari

The php artisan make:job command now accepts a --batched option:

1php artisan make:job ProcessPodcast --batched

This command scaffolds the job with the Batchable trait already applied, so you don’t have to add it manually. It saves you a manual step and ensures consistency.

Learn more about defining batchable jobs

VS Code Extension

VS Code Performance Improvements

Memory Improvements

Pull request by @joetannenbaum

We fixed a memory-leak issue in the extension’s background processes, reducing its long-term footprint and preventing slowdowns during extended coding sessions.

Improved Startup Time

Pull request by @joetannenbaum

Initialization with the VS Code extension now completes in under one second (down from 5–7 seconds) by deferring heavy setup until it’s actually needed. You’ll notice the extension loads almost instantly so you can start building faster.

Get started with the Laravel VS Code extension

Inertia

Allow deepMerge on Custom Properties

Pull request by @mpociot

When implementing infinite scrolling with Inertia or other paginated data merges, you can now specify a key (matchOn) to do a deep merge, matching items by ID and replacing or appending as appropriate. This provides greater flexibility, prevents duplicated entries, and keeps your client-side data consistent.

1Inertia::render('Users/Index', [
2 'users' => Inertia::deepMerge($users)->matchOn('data.id'),
3]);

Learn more in the Inertia docs

Prevent Duplicate Render in React

Pull request by @pascalbaljet

We fixed a React-specific issue in <StrictMode> where the initial Inertia page would render twice. Now you get a single, clean first render without flicker, improving perceived performance.

Get started with the Laravel + React Starter Kit