Laravel 12.44 : Callbacks HTTP afterResponse et nouvelles règles de validation Date

L
Laravel Actu
1 min

Laravel 12.44 enrichit le client HTTP avec la possibilité d’exécuter des callbacks après réception de la réponse. Cette version apporte également des méthodes expressives pour la validation des dates et une nouvelle assertion pour vos tests fonctionnels.

Contexte de cette release

Publiée le 23 décembre 2025, la version 12.44 de Laravel répond à un besoin récurrent des développeurs : inspecter et transformer les réponses HTTP sans alourdir le code métier. Jusqu’à présent, manipuler une réponse après réception nécessitait d’intervenir au niveau du handler Guzzle ou de créer des pipelines personnalisés.

Cette version introduit également des helpers temporels pour la validation des dates, une demande fréquente de la communauté.

La méthode afterResponse() du client HTTP

La nouvelle méthode afterResponse() permet d’attacher des callbacks qui s’exécutent une fois la réponse HTTP construite. Vous pouvez inspecter les headers, déclencher des événements, ou même transformer la réponse en un objet personnalisé.

<?php

use Illuminate\Support\Facades\Http;
use Illuminate\Http\Client\Response;

// Inspection d'un header après réception de la réponse
$response = Http::acceptJson()
    ->baseUrl('https://api.example.com')
    ->afterResponse(function (Response $response) {
        // Enregistrer un avertissement si l'API est dépréciée
        $deprecation = $response->header('X-Deprecation-Notice');
        if ($deprecation) {
            logger()->warning('API dépréciée : ' . $deprecation);
        }
    })
    ->get('/users');

Le callback reçoit l’objet Response complet, ce qui vous donne accès à toutes ses méthodes : header(), body(), json(), status(), etc.

Chaînage de plusieurs callbacks

Vous pouvez chaîner plusieurs appels à afterResponse(). Chaque callback peut retourner une nouvelle instance de réponse, qui sera passée au callback suivant.

<?php

use Illuminate\Support\Facades\Http;
use Illuminate\Http\Client\Response;
use App\Http\Responses\ApiResponse;

$response = Http::acceptJson()
    ->afterResponse(function (Response $response) {
        // Premier callback : logging
        if ($response->failed()) {
            report(new \Exception('Échec API : ' . $response->status()));
        }
        return $response;
    })
    ->afterResponse(function (Response $response) {
        // Second callback : transformation en réponse personnalisée
        return new ApiResponse($response->toPsrResponse());
    })
    ->post('https://api.example.com/orders', [
        'product_id' => 123,
        'quantity' => 2,
    ]);

Cette approche fluide s’intègre parfaitement avec les macros HTTP pour créer des clients API réutilisables.

Création d’un client API avec macro

Voici un exemple concret d’utilisation avec une macro pour un client Shopify :

<?php

use Illuminate\Support\Facades\Http;
use Illuminate\Http\Client\Response;
use App\Events\ShopifyDeprecationNotice;
use App\Http\Responses\ShopifyResponse;

// Définition de la macro dans un ServiceProvider
Http::macro('shopify', function (string $shop, string $token) {
    return Http::acceptJson()
        ->withHeader('X-Shopify-Access-Token', $token)
        ->baseUrl("https://{$shop}.myshopify.com/admin/api/2025-10/")
        ->afterResponse(function (Response $response) use ($shop) {
            // Signaler les dépréciations détectées
            $header = $response->header('X-Shopify-API-Deprecated-Reason');
            if ($header) {
                event(new ShopifyDeprecationNotice($shop, $header));
            }
        })
        ->afterResponse(fn (Response $r) => new ShopifyResponse($r->toPsrResponse()));
});

// Utilisation simplifiée
$products = Http::shopify('ma-boutique', $accessToken)
    ->get('products.json');

Nouvelles méthodes temporelles pour la règle Date

La règle de validation Date s’enrichit de quatre nouvelles méthodes pour valider les dates par rapport au moment présent :

<?php

use Illuminate\Validation\Rule;

$rules = [
    // La date doit être dans le passé (avant maintenant)
    'date_naissance' => Rule::date()->andTime()->past(),

    // La date doit être dans le futur (après maintenant)
    'date_evenement' => Rule::date()->andTime()->future(),

    // La date doit être maintenant ou dans le passé
    'date_debut' => Rule::date()->andTime()->nowOrPast(),

    // La date doit être maintenant ou dans le futur
    'date_fin' => Rule::date()->andTime()->nowOrFuture(),
];

Ces méthodes évitent d’avoir à écrire des règles before:now ou after:now manuellement. Le code devient plus lisible et l’intention est immédiatement claire.

Nouvelle assertion assertHeaderContains()

Pour les tests HTTP, Laravel 12.44 ajoute la méthode assertHeaderContains() à la classe TestResponse :

<?php

namespace Tests\Feature;

use Tests\TestCase;

class ApiTest extends TestCase
{
    public function test_response_contains_cache_header(): void
    {
        $response = $this->get('/api/products');

        // Vérifie que le header contient une valeur spécifique
        $response->assertHeaderContains('Cache-Control', 'max-age');
        $response->assertHeaderContains('Content-Type', 'json');
    }
}

Cette assertion vérifie que la valeur du header contient la chaîne spécifiée, sans exiger une correspondance exacte. Pratique pour les headers composites comme Cache-Control ou Content-Type.

Accès à la locale précédente

L’événement LocaleUpdated expose maintenant la propriété previousLocale :

<?php

use Illuminate\Foundation\Events\LocaleUpdated;
use Illuminate\Support\Facades\Event;

Event::listen(LocaleUpdated::class, function (LocaleUpdated $event) {
    logger()->info(sprintf(
        'Langue changée de %s vers %s',
        $event->previousLocale,
        $event->locale
    ));
});

Cette information facilite le tracking des changements de langue et les audits de localisation.

Autres améliorations notables

  • Désactivation du prune lottery pour DatabaseLock : vous pouvez maintenant désactiver le nettoyage aléatoire des locks expirés via la méthode withoutPruneLottery()
  • Événement MigrationSkipped : un nouvel événement est déclenché quand une migration est ignorée, utile pour le monitoring
  • Correction du typage Query Builder : les méthodes retournent maintenant explicitement des instances de stdClass
  • Fix Password::required() : correction d’un bug de validation avec les valeurs nullables

Mise à jour

Pour mettre à jour votre projet vers Laravel 12.44 :

composer update laravel/framework

Aucun breaking change n’est introduit dans cette version mineure.

Ressources

À propos de Laravel Actu

Développeur passionné par Laravel et son écosystème.

Voir tous les articles
Partager :

Ne manquez aucune actualité Laravel

Recevez les meilleurs articles et tutoriels directement dans votre boîte mail.

Pas de spam. Désinscription possible à tout moment.