1. Home
  2. /Blog
  3. /Laravel 13: Release Date, New Features, and How to Prepare (2026)
2026-02-234 min readLoading views...Backend

Laravel 13: Release Date, New Features, and How to Prepare (2026)

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.

LaravelLaravel 13PHP 8.3PHP AttributesBackend

Laravel 13: Release Date, New Features, and How to Prepare (2026)

2026-02-234 min readBackend
Table of contents
PHP versionPHP Attributes instead of class propertiesCache::touch()Support timeline13.x repo and Laravel BoostUpgrading to Laravel 13

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.

PHP version

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.

PHP Attributes instead of class properties

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:

php
#[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.

php
#[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]).

Cache::touch()

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.

php
Cache::touch('user_session:123', 3600); // seconds
Cache::touch('analytics_data', now()->addHours(6)); // DateTime
Cache::touch('report_cache', null); // no expiry

Under 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.

Support timeline

VersionPHPReleaseBug fixes untilSecurity until
108.1 – 8.3Feb 14, 2023Aug 6, 2024Feb 4, 2025
118.2 – 8.4Mar 12, 2024Sep 3, 2025Mar 12, 2026
128.2 – 8.5Feb 24, 2025Aug 13, 2026Feb 24, 2027
138.3 – 8.5Q1 2026Q3 2027Q1 2028

Laravel 12 keeps bug fixes until August 13, 2026 and security fixes until February 24, 2027.

13.x repo and Laravel Boost

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.):

bash
composer require laravel/boost --dev
php artisan boost:install

Boost exposes 15+ tools so an agent can stick to Laravel conventions when generating or changing code.

Upgrading to Laravel 13

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).

Comments

No comments yet

Loading comments...

Table of contents
PHP versionPHP Attributes instead of class propertiesCache::touch()Support timeline13.x repo and Laravel BoostUpgrading to Laravel 13
or search for other articles
Previous

Why OpenClaw is the "Iron Man Jarvis" for Developers (and How to Set It Up)

2026-02-08Engineering
No next post

Let's Talk.

LinkedInGitHubTwitter

© 2024 idnasirasira.

Designed & Engineered with ♥ in Jakarta.