The Laravel ecosystem is moving at lightning speed, and Laravel 13—scheduled for release on March 17, 2026—is shaping up to be one of the most refined updates yet. Officially presented by Taylor Otwell at Laracon EU, Laravel 13 doesn't aim to reinvent the wheel or introduce massive breaking changes. Instead, it focuses heavily on developer experience (DX), modern PHP 8.3 features, and quality-of-life improvements.
If you're wondering what's changing and how to use the new features, you're in the right place. Let's dive deep into everything coming in Laravel 13, complete with practical code examples.
1. The Great PHP Attributes Overhaul
The absolute headline feature of Laravel 13 is the profound, framework-wide adoption of PHP 8 Attributes. Historically, Laravel components (Models, Jobs, Commands) were configured using protected properties. Now, you can configure almost everything using clean, declarative attributes right above your class declarations.
*Note: This is a 100% additive, non-breaking change. If you prefer the old property-based approach, it will continue to work perfectly! *
Eloquent Models
You can now define your table names, hidden attributes, fillable attributes, and more without cluttering the inside of your class.
Before (Laravel 12):
class User extends Model
{
protected $table = 'system_users';
protected $primaryKey = 'user_id';
public $incrementing = false;
protected $keyType = 'string';
protected $fillable = ['name', 'email'];
protected $hidden = ['password', 'remember_token'];
}
After (Laravel 13):
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Attributes\Table;
use Illuminate\Database\Eloquent\Attributes\Fillable;
use Illuminate\Database\Eloquent\Attributes\Hidden;
#[Table('system_users', key: 'user_id', keyType: 'string', incrementing: false)]
#[Fillable(['name', 'email'])]
#[Hidden(['password', 'remember_token'])]
class User extends Model
{
// The class body is beautifully empty!
}
Available model attributes in Laravel 13 include: #[Appends], #[Connection], #[Guarded], #[Touches], #[Unguarded], and #[Visible].
Queue Jobs
Queue configuration translates perfectly to attributes. Instead of public properties that feel disconnected from the class signature, you declare the configuration at the top.
Laravel 13 Job Example:
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\Attributes\Connection;
use Illuminate\Queue\Attributes\Queue;
use Illuminate\Queue\Attributes\Tries;
use Illuminate\Queue\Attributes\Timeout;
use Illuminate\Queue\Attributes\Backoff;
#[Connection('redis')]
#[Queue('long_running_tasks')]
#[Tries(5)]
#[Timeout(120)]
#[Backoff([10, 30, 60])] // Retry after 10s, then 30s, then 60s
class ProcessPodcast implements ShouldQueue
{
public function handle()
{
// Process the heavy lifting...
}
}
Console Commands
Artisan commands are getting the attribute treatment as well. You no longer need to define $signature and $description properties.
use Illuminate\Console\Command;
use Illuminate\Console\Attributes\Signature;
use Illuminate\Console\Attributes\Description;
#[Signature('reports:generate {user} {--queue}')]
#[Description('Generate a monthly analytics report for a specific user.')]
class GenerateReportCommand extends Command
{
public function handle()
{
$user = $this->argument('user');
// ...
}
}
Other Framework Components
Attributes are spreading everywhere:
-
Form Requests:
#[RedirectTo('/dashboard')]or#[StopOnFirstFailure] -
API Resources:
#[Collects(User::class)]or#[PreserveKeys] -
Factories and Seeders:
#[UseModel(User::class)]or#[Seed]
2. The Cache::touch() Method
A massive performance win for high-traffic applications is the introduction of Cache::touch().
Previously, if you wanted to extend the Time-To-Live (TTL) of a cached item, you had to retrieve the payload from the cache store and then PUT it back. This resulted in unnecessary memory usage and network transfer, especially for large cached objects.
Laravel 13 bypasses this completely by utilizing native cache store commands (like Redis EXPIRE or Memcached TOUCH).
The Old Way (Slow):
// Grabs the whole payload over the network
$payload = Cache::get('heavy_analytics_dashboard');
// Sends the whole payload back over the network
Cache::put('heavy_analytics_dashboard', $payload, now()->addHours(6));
The Laravel 13 Way (Blazing Fast):
use Illuminate\Support\Facades\Cache;
// Simply extends the TTL without fetching the payload!
Cache::touch('heavy_analytics_dashboard', now()->addHours(6));
// You can also pass seconds:
Cache::touch('user_session:123', 3600);
// Or extend indefinitely:
Cache::touch('permanent_report', null);
Note: Cache::touch() returns true on success and false if the key doesn't exist.
3. Laravel Reverb: The Database Driver
Laravel Reverb brought blistering-fast first-party WebSockets to the ecosystem. However, to scale Reverb horizontally across multiple servers, you previously had to use Redis to manage the Pub/Sub messaging between nodes.
In Laravel 13, Reverb introduces a Database Driver. If you are building a small-to-medium application and want to avoid the infrastructure cost and complexity of spinning up a dedicated Redis instance, you can now use your existing MySQL or PostgreSQL database to scale real-time features!
# In your .env file
REVERB_CONNECTION=database
This lowers the barrier to entry for highly scalable, real-time Laravel apps.
4. Starter Kits: First-Class Teams & Native Passkeys
Built-in Teams capabilities
If you run a SaaS, you know the pain of building a multi-tenant "Teams" system. Previously, it was tied specifically to Jetstream. In Laravel 13, the official Starter Kits are reintroducing vastly improved, native Teams functionality. This will allow users to simultaneously act on behalf of different teams via distinct URLs (even in different browser tabs) without encountering session conflicts.
Native Passkey Authentication
WebAuthn (Passkeys) is natively integrated directly into Laravel Fortify and the Starter Kits. Your users can securely log in via Face ID, Touch ID, or hardware security keys out-of-the-box, letting you ditch complex, third-party WebAuthn packages.
5. Granular Job Queue Control
Laravel 13 introduces more granular control over failing jobs, specifically with the maxExceptions configuration. If a job interacts with an unstable third-party API, you can now specify exactly how many exceptions are allowed before the job entirely fails, giving you tighter control over your retry thresholds.
use Illuminate\Queue\Attributes\MaxExceptions;
#[MaxExceptions(3)] // Fails permanently if it throws 3 exceptions!
class SyncWithUnstableApi implements ShouldQueue
{
// ...
}
6. The Laravel AI SDK Reaches Stable
First introduced as a beta, the Laravel AI SDK will officially be marked as stable with the release of Laravel 13.
This SDK acts as an official, elegant wrapper around providers like Anthropic, OpenAI, and Google Gemini. It gives you a fluent, Eloquent-like syntax for interacting with Large Language Models, allowing you to easily build AI capabilities into your app without worrying about the underlying provider's HTTP API.
7. Under the Hood: PHP 8.3 and Default Concurrency
While the DX improvements are front and center, Laravel 13 brings the heat under the hood as well:
- PHP 8.3 Minimum Requirement: It's time to upgrade! Laravel 13 drops support for PHP 8.2. You must be on PHP 8.3+, ensuring the framework can fully leverage typed class constants, dynamic class constant fetches, and new standard library functions.
- Symfony 7.4 & 8.0 Foundation: The underlying Symfony components have been bumped, securing the framework well into the future.
-
HTTP Client Concurrency:
Http::pool()now defaults to a concurrency level of2, meaning bulk API requests via the pool will execute concurrently out of the box without any extra configuration.
use Illuminate\Support\Facades\Http;
use Illuminate\Http\Client\Pool;
// Executes concurrently automatically in Laravel 13!
$responses = Http::pool(fn (Pool $pool) => [
$pool->get('https://api.example.com/endpoint-1'),
$pool->get('https://api.example.com/endpoint-2'),
]);
Conclusion & Upgrade Timeline
Laravel 13 is the definition of a mature framework: zero breaking changes to your application code, additive DX features, and deep performance optimizations.
Important Dates:
- Release Date: March 17, 2026
- Bug Fixes: Supported until Q3 2027
- Security Fixes: Supported until Q1 2028
The upgrade path will be exceptionally smooth. Whether you adopt the new PHP attributes immediately or stick with properties, Laravel 13 is ready to push the ecosystem forward. Start preparing your servers for PHP 8.3 today!
Top comments (0)