Laravel 13 lands March 2026 with PHP 8.3, PHP Attributes for models and queues, Cache::touch(), and support through Q1 2028. What's new and how to get ready.
Laravel 13 is the next major release, scheduled for March 2026. Minimum PHP jumps to 8.3; support runs as usual—bug fixes through Q3 2027, security through Q1 2028.
What’s below is what’s confirmed so far from Laravel News and the official 13.x repo: no speculation, just framework and PRs.
Laravel 13 will require PHP 8.3 as the minimum (PR #54763), up from 8.2 in Laravel 12. If you’re still on 8.2 in production, that’s the first thing to sort before you think about upgrading.
PR #58578 adds PHP 8 Attributes as an alternative to configuring components via class properties. Existing property-based config still works—this is additive.
Eloquent. You can drop $table, $hidden, $fillable, and the like and use attributes instead:
#[Table('users', key: 'user_id', keyType: 'string', incrementing: false)]#[Hidden(['password'])]#[Fillable(['name', 'email'])]class User extends Model {}Available on models:
#[Appends] — Virtual attributes appended to array/JSON output (replaces $appends).#[Connection] — Database connection name (replaces $connection).#[Fillable] — Mass-assignable attributes (replaces $fillable).#[Guarded] — Attributes guarded from mass assignment (replaces $guarded).#[Hidden] — Attributes hidden from array/JSON (replaces $hidden).#[Table] — Table name, primary key, key type, incrementing (replaces $table, $primaryKey, etc.).#[Touches] — Parent relations to “touch” on update (replaces $touches).#[Unguarded] — Temporarily disable mass-assignment protection (replaces $unguarded).#[Visible] — Attributes explicitly visible in array/JSON (replaces $visible).Queue jobs. Same idea: connection, queue name, tries, timeout—all on the class.
#[Connection('redis')]#[Queue('podcasts')]#[Tries(3)]#[Timeout(120)]class ProcessPodcast implements ShouldQueue {}Queue attributes (same idea on jobs, listeners, notifications, mailables, and broadcast events):
#[Backoff] — Delay(s) between retries, in seconds or array of seconds (replaces $backoff).#[Connection] — Queue connection name, e.g. redis or database (replaces $connection).#[FailOnTimeout] — Mark job as failed if it runs past the timeout (replaces $failOnTimeout).#[MaxExceptions] — Max number of exceptions before the job is failed (replaces $maxExceptions).#[Queue] — Queue name (replaces $queue).#[Timeout] — Max seconds the job may run (replaces $timeout).#[Tries] — Max number of attempts (replaces $tries).#[UniqueFor] — Restrict to one instance of the job per given time window (replaces $uniqueFor).Commands. Signature and description move to attributes—e.g. #[Signature('mail:send {user} {--queue}')] and #[Description('...')].
Elsewhere. Form requests (#[RedirectTo], #[StopOnFirstFailure]), API resources (#[Collects], #[PreserveKeys]), factories (#[UseModel]), test seeders (#[Seed], #[Seeder]).
PR #55954 adds Cache::touch(): extend a key’s TTL without reading or re-writing the value. No more get-then-put just to bump expiry—one call does it.
Cache::touch('user_session:123', 3600); // secondsCache::touch('analytics_data', now()->addHours(6)); // DateTimeCache::touch('report_cache', null); // no expiryUnder the hood: Redis uses a single EXPIRE, Memcached uses TOUCH, the DB driver does one UPDATE. Returns true on success, false if the key doesn’t exist. Works with every driver—Array, APC, Database, DynamoDB, File, Memcached, Memoized, Null, Redis.
| Version | PHP | Release | Bug fixes until | Security until |
|---|---|---|---|---|
| 10 | 8.1 – 8.3 | Feb 14, 2023 | Aug 6, 2024 | Feb 4, 2025 |
| 11 | 8.2 – 8.4 | Mar 12, 2024 | Sep 3, 2025 | Mar 12, 2026 |
| 12 | 8.2 – 8.5 | Feb 24, 2025 | Aug 13, 2026 | Feb 24, 2027 |
| 13 | 8.3 – 8.5 | Q1 2026 | Q3 2027 | Q1 2028 |
Laravel 12 keeps bug fixes until August 13, 2026 and security fixes until February 24, 2027.
The laravel/laravel 13.x branch keeps the usual layout—app, config, database, routes, resources, and the rest. The README also points to Laravel Boost for agent-style workflows (Cursor, Copilot, etc.):
composer require laravel/boost --devphp artisan boost:installBoost exposes 15+ tools so an agent can stick to Laravel conventions when generating or changing code.
Get to PHP 8.3+ everywhere first. Closer to release, the Laravel upgrade guide will get 13-specific notes. For automated upgrade PRs with small, reviewable commits, Laravel Shift is the usual go-to.
References: What We Know About Laravel 13 (Laravel News), laravel/laravel at 13.x (GitHub).
No comments yet
Loading comments...