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()andCache::forget()array handling is corrected.MassPrunablenow includes soft-deleted models — review yourprunable()queries.- Use Laravel Shift to automate the upgrade when Laravel 14 ships.