Skip to content

Laravel 14: New Features, Breaking Changes, and PHP 8.4 Requirement

Laravel 14 is expected in Q1 2027 and will require PHP 8.4. Here is everything known so far from the master branch: new features, breaking changes, and the official support timeline.

Published · Updated · 4 min read

Laravel 14: New Features, Breaking Changes, and PHP 8.4 Requirement

Laravel 14: What We Know So Far

Laravel 14 is the next major release of the framework, expected in Q1 2027. It will require PHP 8.4 as the minimum version — up from PHP 8.3 in Laravel 13 — largely because Symfony 8 itself requires PHP 8.4. The Laravel team has not published an official release date or final feature list yet. Everything below is sourced from the master branch of laravel/framework and may change before release.


New Features

Route::query()

PR #60655 adds routing support for the HTTP QUERY method — a safe method that can carry a request body.

Route::query('/search', function () {
    return request()->input('filter');
});

Route::any() includes QUERY, and the CSRF middleware treats it as a read request, the same as GET, HEAD, and OPTIONS.

$user->authorize()

An authorize() method is being added to the Authorizable contract and trait. Unlike $user->can(), it throws an AuthorizationException on failure.

// Laravel 13
Gate::forUser($user)->authorize('viewAny', Post::class);

// Laravel 14
$user->authorize('viewAny', Post::class);

Context for report()

The report() helper now accepts an optional context array, making it easier to attach structured data to reported exceptions.

try {
    $order->charge();
} catch (Throwable $e) {
    report($e, ['order_id' => $order->id]);
}

Note: the ExceptionHandler contract signature changes to report(Throwable $e, array $context = []), so custom handlers that override report() will need updating.

Storage::fake() for On-Demand Disks

Storage::fake('ondemand') will now intercept Storage::build() calls, letting you test on-demand disks with the same assertions as named disks.

orWhereKey() and Subqueries in whereKey()

New orWhereKey() and orWhereKeyNot() methods are added, and all four whereKey variants now accept a subquery.


Breaking Changes

Queue Pause Methods Reordered

The argument order for Queue::pause(), Queue::pauseFor(), Queue::resume(), and Queue::isPaused() changes: the queue name comes first, and the connection becomes an optional second argument.

// Laravel 13
Queue::pause('redis', 'emails');

// Laravel 14
Queue::pause('emails');
Queue::pause('emails', 'redis');

lazy() and chunk() No Longer Mutate the Builder

In Laravel 13, calling lazy() or chunk() modifies the underlying query builder, causing incorrect results if you reuse the builder afterward. Laravel 14 fixes this — $query->count() after a lazy() loop will return the correct total.

findOr() With an Array of IDs

Builder::findOr() previously ignored its callback when passed an array of IDs. In Laravel 14, it behaves consistently with findOrFail() and calls the callback when any ID is missing.

Cache::has() and Cache::forget() With Arrays

Both methods now correctly handle arrays of keys. Cache::has(['a', 'b']) returns true only when every key exists. Cache::forget(['a', 'b']) removes all listed keys and returns true only when all were removed.

MassPrunable Includes Soft-Deleted Models

MassPrunable now adds withTrashed() to the prune query when the model uses soft deletes, matching the behavior of Prunable. If you rely on the old behavior, add withoutTrashed() to your prunable() query explicitly.


Support Timeline

| Version | PHP | Release | Bug Fixes Until | Security Fixes Until | |---------|-----|---------|-----------------|----------------------| | 12 | 8.2–8.5 | Feb 24, 2025 | Aug 13, 2026 | Feb 24, 2027 | | 13 | 8.3–8.5 | Mar 17, 2026 | Q3 2027 | Mar 17, 2028 | | 14 | 8.4+ | Q1 2027 | Q3 2028 | Q1 2029 |


Key Takeaways

  • PHP 8.4 is required — plan your server upgrades accordingly.
  • Route::query() brings native HTTP QUERY method support to routing.
  • $user->authorize() simplifies authorization checks that should throw on failure.
  • report() gains an optional context array; custom exception handlers need a signature update.
  • Queue pause method argument order is reversed — audit any calls to Queue::pause() and related methods.
  • lazy() / chunk() builder mutation is fixed; Cache::has() and Cache::forget() array handling is corrected.
  • MassPrunable now includes soft-deleted models — review your prunable() queries.
  • Use Laravel Shift to automate the upgrade when Laravel 14 ships.

Source: What We Know About Laravel 14 — Laravel News

Frequently asked questions

When is Laravel 14 expected to be released?

Laravel 14 is expected in Q1 2027, following Laravel's standard annual release cycle. No official release date has been announced yet.

What PHP version does Laravel 14 require?

Laravel 14 requires PHP 8.4 as the minimum version, up from PHP 8.3 in Laravel 13. This change is driven by the Symfony 8 dependency, which also requires PHP 8.4.

What are the most important breaking changes in Laravel 14 to prepare for?

Key breaking changes include: the argument order for Queue pause methods is reversed (queue name first, connection second); Cache::has() and Cache::forget() now correctly handle arrays; MassPrunable includes soft-deleted models; and lazy()/chunk() no longer mutate the query builder. Custom exception handlers that override report() also need a new $context parameter.

Mohamed Said

About the author

Senior Backend Engineer specializing in Laravel, scalable SaaS platforms, APIs, and cloud infrastructure. I build secure, high-performance web applications that help businesses grow.

About GitHub LinkedIn WhatsApp Email Address My CV

Have a technical challenge?

Tell me what you’re building. I reply within two working days.

Discuss your project