Laravel 13.7 est là : Tests JSON simplifiés, gestion des polices et Jobs interruptibles

Par Devinsto
Posté le 30 avril 2026
Mis à jour le 4 novembre 2026
12 min de lecture
109 vues

La version 13.7 de Laravel vient de sortir, apportant son lot d'améliorations pour le confort des développeurs (DX) et la robustesse des applications en production. Au programme : des tests plus courts, une optimisation automatique des polices avec Vite, et une fonctionnalité majeure pour la gestion des files d'attente (queues).

1. Des assertions JSON plus propres dans vos tests

Jusqu'à présent, pour vérifier plusieurs valeurs spécifiques dans une réponse JSON complexe, vous deviez enchaîner plusieurs fois la méthode assertJsonPath.

Avant (Laravel 13.6 et inférieur) :

codePHP

$response = $this->getJson('/api/user/profile');

$response->assertOk()
    ->assertJsonPath('data.id', 1)
    ->assertJsonPath('data.name', 'John Doe')
    ->assertJsonPath('meta.version', '1.0.0');

Maintenant (Laravel 13.7) :

Laravel introduit assertJsonPaths (au pluriel), qui accepte un tableau associatif. Cela rend vos tests beaucoup plus lisibles et compacts.

codePHP

$response = $this->getJson('/api/user/profile');

$response->assertOk()
    ->assertJsonPaths([
        'data.id' => 1,
        'data.name' => 'John Doe',
        'meta.version' => '1.0.0',
    ]);

Exemple sur un projet réel : Imaginez que vous testiez un tableau de bord de statistiques. Au lieu de 10 lignes d'assertions, un seul tableau suffit pour valider l'intégrité de vos données clés.


2. Chargement intelligent des polices avec @fonts

Si vous utilisez l'optimisation des polices de Vite, Laravel 13.7 simplifie l'intégration dans vos templates Blade. Plus besoin de gérer manuellement les liens de préchargement (preload) ou les styles inline dans votre <head>.

Utilisation :

Ajoutez simplement la directive @fonts dans votre layout principal.

codeHtml

<!-- resources/views/layouts/app.blade.php -->
<head>
    <title>Mon Application</title>
    @vite(['resources/css/app.css', 'resources/js/app.js'])
    
    {{-- Génère automatiquement les liens de préchargement et styles CSS --}}
    @fonts(['sans', 'mono'])
</head>

Cette directive s'occupe de rendre les balises nécessaires pour que vos polices se chargent sans flash de texte non stylisé (FOUT), améliorant ainsi vos scores Core Web Vitals (SEO/Performance).


3. La révolution des "Interruptible Jobs" (Signal Handling)

C'est la fonctionnalité phare de cette mise à jour. En production, il arrive souvent qu'un Worker de file d'attente doive s'arrêter (redémarrage du serveur, déploiement, mise à l'échelle automatique).

Auparavant, si un Job était en train de s'exécuter, il s'arrêtait brutalement, laissant parfois les données dans un état incohérent (par exemple, un export CSV marqué comme "en cours" mais qui ne finira jamais).

La solution : L'interface Interruptible

Désormais, vos Jobs peuvent implémenter l'interface Interruptible et définir une méthode interrupted(). Cette méthode est appelée automatiquement lorsque le Worker reçoit un signal d'arrêt de votre infrastructure.

Exemple sur un projet réel : Un export de données massif

Imaginons un Job qui génère un gros fichier Excel. Si le serveur s'arrête au milieu, nous voulons prévenir l'utilisateur ou nettoyer la base de données.

codePHP

namespace App\Jobs;

use App\Models\Export;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\Interruptible; // Nouvelle interface

class ProcessLargeExport implements ShouldQueue, Interruptible
{
    use InteractsWithQueue, SerializesModels;

    public function __construct(public Export $export) {}

    public function handle(): void
    {
        // Logique de l'export...
        // Simulation d'une tâche longue
        foreach ($this->data as $row) {
            // Traitement...
        }
        
        $this->export->update(['status' => 'completed']);
    }

    /**
     * Cette méthode s'exécute si le Worker reçoit un signal d'arrêt (SIGTERM)
     */
    public function interrupted(int $signal): void
    {
        // On met à jour le statut en base pour informer l'utilisateur
        $this->export->update([
            'status' => 'interrupted',
            'error_message' => "L'export a été interrompu par le système (Signal: $signal). Il sera relancé."
        ]);

        // Optionnel : Envoyer une alerte ou logger l'événement
        logger()->warning("Job d'export ID {$this->export->id} interrompu.");
    }
}

Pourquoi c'est important ?

  1. Intégrité des données : Vous évitez les tâches "fantômes" qui restent bloquées indéfiniment.

  2. Meilleure UX : Vous pouvez afficher un message précis à l'utilisateur au lieu de le laisser deviner pourquoi l'action n'avance plus.

  3. Nettoyage : Vous pouvez supprimer des fichiers temporaires créés avant l'arrêt du processus.


Conclusion

Laravel 13.7 continue de prouver que le framework ne se contente pas d'ajouter des gadgets, mais résout des problèmes concrets de production. La gestion des signaux dans les files d'attente est un pas de géant pour la fiabilité des applications d'entreprise.

Ajouter un commentaire

Vous devez être connecté pour laisser un commentaire.

Soyez le premier à commenter cet article !