veilletech.fr
29 oct. Feed du jour
#05 SYMFONY Article

Symfony 8.2 : génériques dans le Serializer

Vos PHPDoc deviennent du code exécuté.

Symfony 8.2 apprend au Serializer et à TypeInfo à résoudre les génériques déclarés en PHPDoc : une propriété typée Page<Product> dénormalise enfin ses éléments en Product. Deux changements de comportement accompagnent la nouveauté : un élément d'union non résolu lève une exception, et une propriété typée list recevant un objet JSON déclenche une dépréciation, qui deviendra une exception en Symfony 9.0.

3 min de lectureavancévidéo 1:34
Partager
Sommaire5 sections
  1. Ce qui se passe
  2. Les génériques en dénormalisation
  3. Les deux ruptures à anticiper
  4. Deux ajouts côté TypeInfo
  5. À retenir

Ce qui se passe

Le composant Serializer s'appuie sur TypeInfo pour connaître le type de chaque propriété qu'il dénormalise. Symfony 8.2 élargit ce que les deux comprennent de vos PHPDoc — génériques et unions dans les tableaux — et les rend plus stricts sur ce qu'ils acceptent.

Les génériques en dénormalisation

La normalisation fonctionnait déjà avec les classes génériques. En dénormalisation, le Serializer ignorait les types template : une propriété @var T était dénormalisée comme sa borne, ou laissée en tableau brut quand le template n'en avait pas.

En 8.2, le type template est résolu depuis le type générique déclaré sur la propriété qui porte l'objet :

src/Dto/ProductCatalog.phpPHP
final class ProductCatalog
{
    /** @var Page<Product> */
    public Page $products;
}

Le Serializer lit Page<Product>, résout T en Product, et utilise ce type pour dénormaliser les éléments de Page::$items. Cela vaut aussi pour le nullable, les génériques imbriqués, plusieurs templates, les unions, les arguments de constructeur et les collections de génériques comme list<Page<Product>>.

Deux conditions pratiques :

Contribution de Yonel Ceruto, PR #66005.

Les deux ruptures à anticiper

Unions dans une collection. Le Serializer savait dénormaliser une valeur typée CardPayment|BankTransfer, mais les éléments de la même union dans une collection restaient des tableaux bruts. En 8.2, list<CardPayment|BankTransfer> voit ses éléments dénormalisés — et c'est un changement de comportement : un élément qui ne correspond à aucun membre de l'union, ou une clé qui ne correspond pas au type de clé, lève désormais une exception au lieu d'être renvoyé tel quel. Contribution de Pascal Cescon, PR #63811.

Une propriété list doit contenir une liste. Un list<string> promet des clés entières consécutives à partir de zéro, ce qu'un array<int, string> ne promet pas. Le Serializer traitait les deux de la même façon et acceptait donc un objet JSON dans une propriété list. En 8.2, cela fonctionne encore mais déclenche une dépréciation ; en Symfony 9.0, ce sera une NotNormalizableValueException. Les listes valides et les propriétés typées avec d'autres types de tableau ne sont pas concernées. Contribution de Hubert Lenoir, PR #63971.

Si vos clés portent du sens, ce n'est pas un défaut à corriger côté données : déclarez un type de tableau qui les autorise. Si la propriété représente bien une liste, envoyez un tableau JSON.

Deux ajouts côté TypeInfo

Source : blog Symfony, 27 octobre 2026. Source en anglais.