Aller au contenu
Lantorian

Laravel9 min de lecture

Nouveautés Laravel 13

Laravel 13 est sorti le 17 mars 2026. Peu de changements cassants, beaucoup de confort : attributs PHP, SDK IA officiel, ressources JSON:API. Voici ce qui change ta façon d'écrire du code.

Quelle version, jusqu'à quand

Une version majeure par an. Chaque version reçoit 18 mois de corrections de bugs et 2 ans de correctifs de sécurité. Laravel 13 demande PHP 8.3 au minimum (on vise 8.4).

20242025202620272028
Laravel 11
Laravel 12
Laravel 13
Corrections de bugsSécurité uniquement
Laravel 11 n'est plus maintenu, Laravel 12 ne reçoit plus que des correctifs de sécurité. Tout nouveau projet démarre en Laravel 13.

Les attributs PHP partout

Plus de quinze endroits du framework acceptent désormais des attributs PHP à la place des propriétés de classe. C'est optionnel et non cassant : la configuration se lit en haut de la classe. Bascule pour comparer.

Modèles Eloquent

app/Models/Invoice.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Attributes\Fillable;
use Illuminate\Database\Eloquent\Attributes\Hidden;
use Illuminate\Database\Eloquent\Attributes\Table;
use Illuminate\Database\Eloquent\Model;

#[Table('billing_invoices')]
#[Fillable(['customer_id', 'status', 'total'])]
#[Hidden(['internal_notes'])]
class Invoice extends Model
{
}

Jobs en file

app/Jobs/SendInvoiceReminder.php
<?php

use Illuminate\Queue\Attributes\Backoff;
use Illuminate\Queue\Attributes\FailOnTimeout;
use Illuminate\Queue\Attributes\Timeout;
use Illuminate\Queue\Attributes\Tries;

#[Tries(3)]
#[Backoff([60, 300])]
#[Timeout(120)]
#[FailOnTimeout]
class SendInvoiceReminder implements ShouldQueue
{
    use Queueable;
}

Middleware et autorisation dans les contrôleurs

app/Http/Controllers/CommentController.php
<?php

namespace App\Http\Controllers;

use App\Models\Comment;
use App\Models\Post;
use Illuminate\Routing\Attributes\Controllers\Authorize;
use Illuminate\Routing\Attributes\Controllers\Middleware;

#[Middleware('auth')]
class CommentController
{
    #[Middleware('subscribed')]
    #[Authorize('create', [Comment::class, 'post'])]
    public function store(Post $post)
    {
        // ...
    }
}

Laravel AI SDK

Le SDK IA officiel est stable : une seule API pour le texte, les agents avec outils, les images, l'audio et les embeddings. Changer de fournisseur (OpenAI, Anthropic, Gemini) est une question de configuration, pas de réécriture.

app/Services/SalesInsights.php
<?php

use App\Ai\Agents\SalesCoach;
use Illuminate\Support\Str;
use Laravel\Ai\Image;

// Agent: provider (OpenAI, Anthropic, Gemini...) is configuration, not code
$response = SalesCoach::make()->prompt('Analyze this sales transcript...');

// Images and embeddings with the same fluent API
$image = Image::of('A donut sitting on the kitchen counter')->generate();
$embeddings = Str::of('Napa Valley has great wine.')->toEmbeddings();

La recherche sémantique arrive dans le query builder avec whereVectorSimilarTo(), sur PostgreSQL avec l'extension pgvector.

app/Actions/Search/SearchDocuments.php
<?php

// PostgreSQL + pgvector: search by meaning, not by keyword
$documents = DB::table('documents')
    ->whereVectorSimilarTo('embedding', 'Best wineries in Napa Valley')
    ->limit(10)
    ->get();

Ressources JSON:API

Laravel génère maintenant des réponses conformes à la spécification JSON:API : relations incluses, champs partiels, liens et en-têtes. Utile quand un client externe impose ce format ; pour nos fronts Next.js, les JsonResource classiques restent la norme.

terminal
php artisan make:resource InvoiceResource --json-api
app/Http/Resources/InvoiceResource.php
<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\JsonApi\JsonApiResource;

class InvoiceResource extends JsonApiResource
{
    public $attributes = ['status', 'total', 'due_at'];

    public $relationships = ['customer', 'lines'];
}

Les petites nouveautés utiles

  • Queue::route() centralise quelle file et quelle connexion utilise chaque job.
  • Cache::touch() prolonge la durée de vie d'une clé sans relire ni réécrire sa valeur.
  • Le middleware PreventRequestForgery vérifie l'origine de la requête (en-tête Sec-Fetch-Site) en plus du jeton CSRF.
  • Les passkeys sont intégrées à Fortify et aux starter kits : connexion sans mot de passe prête à l'emploi.
app/Providers/AppServiceProvider.php
<?php

// AppServiceProvider::boot(): one place to route jobs to queues
Queue::route(ProcessPodcast::class, connection: 'redis', queue: 'podcasts');

// Extend a cache TTL without reading and rewriting the value
Cache::touch('dashboard:stats');

L'écosystème à connaître

OutilPourquoi
Pest 4Tests navigateur avec Playwright, régression visuelle, sharding de la suite en CI.
Laravel BoostServeur MCP et consignes qui donnent aux assistants IA le contexte exact de ton application (versions, schéma, routes).
Starter kitsBase React, Vue ou Livewire avec authentification, passkeys et Pest déjà configurés.
NightwatchMonitoring officiel : requêtes lentes, exceptions, jobs échoués en production.
Laravel CloudHébergement géré par l'équipe Laravel, déploiement à chaque push.

Mettre à jour depuis Laravel 12

La plupart des applications migrent en moins d'une heure. On le fait toujours sur une branche dédiée, chore/upgrade-laravel-13.

terminal
composer require laravel/framework:^13.0 laravel/tinker:^3.0 --with-all-dependencies
composer require pestphp/pest:^4.0 phpunit/phpunit:^12.0 --dev --with-all-dependencies

php artisan test --parallel   # then read the upgrade guide line by line

Source : notes de version officielles Laravel 13, vérifiées en septembre 2026.