Symfony 7.2.0 sort le 29 novembre 2024, une semaine après PHP 8.4 GA. Ce n'est pas une version de maintenance : elle s'attaque à trois irritants qui forçaient les équipes à contourner le framework plutôt qu'à l'utiliser. CSRF sans état serveur pour en finir avec les conflits de cache, composant TypeInfo promu stable, keepalive Messenger pour éliminer les timeouts silencieux sur les traitements longs, et trois nouvelles contraintes de validation natives. Tour d'horizon de ce qui mérite une activation immédiate — et de ce qui se teste d'abord en staging.
CSRF stateless : fini le conflit avec Varnish et Cloudflare
Le problème classique : ton formulaire Symfony génère un token CSRF stocké en session. Varnish met la page en cache. Le deuxième visiteur reçoit le HTML avec le token du premier — la validation explose. Cloudflare en mode full-cache, même scénario. Symfony 7.2 résout ça à la racine en introduisant un stockage stateless basé sur HMAC : le token est signé avec le secret applicatif et un identifiant de token, sans rien écrire en session. N'importe quel nœud peut valider le token, sans état partagé, sans sticky session.
# config/packages/framework.yaml
framework:
csrf_protection:
# Symfony 7.2 : token HMAC signé, sans session
storage_service: security.csrf.token_storage.stateless
token_id: 'default'Le token est livré via un cookie HttpOnly signé côté serveur — compatible avec n'importe quel reverse proxy en cache total. Pour les appels fetch côté client, tu lis le cookie et tu le renvoies en header X-CSRF-Token. Le contrôleur reste identique :
<?php
// src/Controller/OrderController.php
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Csrf\CsrfToken;
use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
#[Route('/order/create', methods: ['POST'])]
public function create(
Request $request,
CsrfTokenManagerInterface $csrf
): Response {
$token = new CsrfToken(
'order_create',
$request->headers->get('X-CSRF-Token')
);
if (!$csrf->isTokenValid($token)) {
throw $this->createAccessDeniedException('Token CSRF invalide.');
}
// ... logique métier
}À activer immédiatement sur toute application derrière un CDN ou un reverse proxy avec cache. À tester en staging si tu combines panier persistant et cache partiel : vérifie que le cookie CSRF et le cookie de session ne créent pas de conflit selon ta config cookie_samesite et tes règles de cache par URL.
TypeInfo stable et keepalive Messenger : deux promotions majeures
TypeInfo était expérimental depuis Symfony 6.4. La 7.2 le passe stable avec un engagement de rétrocompatibilité complet. Le composant expose une API unifiée pour introspécter les types PHP — natifs, union, intersection, génériques via PHPDoc — sans parser manuellement les DocBlocks ni dépendre d'une librairie tierce. Directement utile pour les serializers maison, les validateurs custom et les générateurs de schéma OpenAPI ou JSON Schema.
<?php
use Symfony\Component\TypeInfo\TypeResolver\TypeResolver;
$resolver = TypeResolver::create();
// Résolution sur une propriété de classe
$type = $resolver->resolve(new \ReflectionProperty(Order::class, 'items'));
// Type riche : collection d'objets
$type->getBaseType(); // 'array'
$type->getCollectionValueType(); // Type(App\Entity\OrderItem)
$type->isNullable(); // falseBesoin d'un expert Symfony ?
Réserver un appel →Messenger keepalive règle un timeout silencieux qui touchait les traitements longs sur Redis Stream ou AMQP. Avant 7.2, un handler qui tournait cinq minutes relâchait le verrou avant la fin : le worker rejouait le message encore en cours de traitement, avec des effets de bord difficiles à déboguer. Symfony 7.2 ajoute un mécanisme de keepalive configurable par transport qui renouvelle automatiquement le verrou pendant l'exécution :
# config/packages/messenger.yaml
framework:
messenger:
transports:
async:
dsn: '%env(MESSENGER_TRANSPORT_DSN)%'
options:
# Renouvelle le verrou toutes les 20s pendant le traitement
keepalive_interval: 20À activer immédiatement si tu as des handlers longs — import CSV, génération PDF, appels API tiers chaînés — sur Redis Stream ou AMQP. Les deux transports implémentent KeepaliveReceiverInterface nativement en 7.2. Le gain est immédiat sur les environnements où le timeout Redis est inférieur à la durée réelle de traitement.
Trois nouvelles contraintes de validation
Symfony 7.2 livre trois contraintes que la plupart des projets réimplémentaient avec des regex ou des validators custom. Elles couvrent des cas métier fréquents et n'ajoutent aucune dépendance externe :
<?php
use Symfony\Component\Validator\Constraints as Assert;
class ReportDto
{
// Semaine ISO 8601 — plannings, rapports hebdomadaires
#[Assert\Week(min: '2024-W01', max: '2025-W52')]
public string $isoWeek;
// Nombre de mots — contenu éditorial, non le nombre de caractères
#[Assert\WordCount(min: 50, max: 800)]
public string $body;
// Syntaxe YAML — config avancée exposée aux utilisateurs
#[Assert\Yaml]
public string $extraConfig;
}- Week : valide les semaines au format ISO 8601 (ex : 2024-W48) avec bornes min/max optionnelles. Élimine les regex artisanales dans les apps de planning ou de reporting.
- WordCount : compte les mots, pas les octets ni les caractères. Indispensable pour les champs éditoriaux où la contrainte métier est une fourchette de mots, pas une longueur brute.
- Yaml : valide qu'une chaîne est du YAML syntaxiquement correct. Utile dès qu'on expose un champ de configuration avancée aux utilisateurs finaux ou aux administrateurs.
Symfony 7.2 règle trois irritants concrets sans ajouter de complexité architecturale : la compatibilité CSRF avec les caches full-page, les timeouts silencieux Messenger, et les contraintes de validation réécrites à la main dans chaque projet. Si ton application tourne derrière Varnish ou Cloudflare, la migration vaut le coup dès le 29 novembre. Tu veux un regard externe sur ta stack Symfony avant d'upgrader ? Bear Scan — un audit technique ciblé pour cartographier les points de friction avant qu'ils deviennent des incidents en production.
Besoin d'un expert Symfony ?
20 ans d'expérience sur l'écosystème PHP/Symfony.