Laravel 13 has officially landed, and while it builds on the stability-focused foundation of Laravel 12, it brings some genuinely exciting developer experience improvements. From native PHP Attributes across the framework to a smarter cache API and first-party passkey support, this release is packed with quality-of-life upgrades.
In this post we'll walk through what's new, what's changed, and how it stacks up against Laravel 12.
What's New in Laravel 13
PHP Attributes Support — Configure Without Properties
The biggest addition in Laravel 13 is first-class support for PHP 8 Attributes across the framework. You can now configure Eloquent models, queue jobs, console commands, form requests, API resources, and more using native PHP attributes instead of class properties. Crucially, this is a non-breaking change — existing property-based configuration continues to work exactly as before.
Eloquent Models
Before Laravel 13, you'd define model config like this:
class User extends Model
{
protected $table = 'users';
protected $hidden = ['password'];
protected $fillable = ['name', 'email'];
}
In Laravel 13, you can replace those properties with attributes:
#[Table('users', key: 'user_id', keyType: 'string', incrementing: false)]
#[Hidden(['password'])]
#[Fillable(['name', 'email'])]
class User extends Model {}
Available model attributes include: #[Appends], #[Connection], #[Fillable], #[Guarded], #[Hidden], #[Table], #[Touches], #[Unguarded], and #[Visible].
Queue Jobs
Queue configuration can now live directly on the job class:
#[Connection('redis')]
#[Queue('podcasts')]
#[Tries(3)]
#[Timeout(120)]
class ProcessPodcast implements ShouldQueue {}
This also applies to listeners, notifications, mailables, and broadcast events.
Console Commands
#[Signature('mail:send {user} {--queue}')]
#[Description('Send a marketing email to a user')]
class SendMailCommand extends Command {}
Other Components
Attributes are also available for form requests (#[RedirectTo], #[StopOnFirstFailure]), API resources (#[Collects], #[PreserveKeys]), factories (#[UseModel]), and test seeders (#[Seed], #[Seeder]).
Cache::touch() — Extend TTL Without a Roundtrip
Laravel 13 introduces Cache::touch(), a method that extends the TTL of a cached item without needing to fetch it first. Previously, you had to get() the value and then put() it back — transferring data over the wire unnecessarily.
// Extend by seconds
Cache::touch('user_session:123', 3600);
// Extend with a DateTime
Cache::touch('analytics_data', now()->addHours(6));
// Extend indefinitely
Cache::touch('report_cache', null);
Under the hood, Redis uses a single EXPIRE command, Memcached uses TOUCH, and the database driver issues a single UPDATE. The method returns true on success and false if the key doesn't exist. All cache drivers are supported: Array, APC, Database, DynamoDB, File, Memcached, Memoized, Null, and Redis.
First-Party Passkey Authentication
Laravel 13 introduces official first-party support for passkey authentication. This brings a modern, passwordless login experience directly into the framework without relying on third-party packages.
PHP 8.3 Minimum Requirement
Laravel 13 requires PHP 8.3 or higher, up from PHP 8.2 in Laravel 12. If you're still on PHP 8.2, you'll need to upgrade before moving to Laravel 13. The release supports PHP 8.3 through 8.5.
Laravel 12 vs Laravel 13 — Feature Comparison
| Feature | Laravel 12 | Laravel 13 |
|---|---|---|
| Minimum PHP version | PHP 8.2 | PHP 8.3 |
| PHP Attributes support | No | Yes (models, jobs, commands, etc.) |
| Cache::touch() | No | Yes |
| Passkey authentication | Via WorkOS/third-party | First-party support |
| Starter kits (React/Vue/Svelte/Livewire) | Yes (introduced in L12) | Yes (continued) |
| WorkOS AuthKit integration | Yes | Yes |
| Breaking changes | Minimal | Minimal (non-breaking attributes) |
| Bug fix support until | August 2026 | Q3 2027 |
| Security fix support until | February 2027 | Q1 2028 |
Should You Upgrade?
If you're on Laravel 11 or 12 and already running PHP 8.3+, upgrading to Laravel 13 is straightforward. The PHP Attributes are additive — you don't need to refactor anything, but you can start using them in new code immediately.
The main consideration is the PHP 8.3 requirement. If your hosting environment is still on PHP 8.2, you'll want to upgrade that first.
For automating the upgrade process, Laravel Shift provides automated upgrade PRs that handle the tedious parts for you.
Support Timeline
Here's how the current Laravel support cycle looks:
- Laravel 11 — Security fixes until March 2026 (end of life)
- Laravel 12 — Bug fixes until August 2026, security until February 2027
- Laravel 13 — Bug fixes until Q3 2027, security until Q1 2028
Conclusion
Laravel 13 continues the framework's tradition of incremental, developer-focused improvements. The PHP Attributes feature alone is a meaningful ergonomic upgrade that makes model and job configuration cleaner and more expressive. Combined with Cache::touch(), native passkey support, and a tighter PHP version floor, it's a solid release worth adopting.
Have you upgraded yet? Let us know in the comments below.