Ce qui se passe
Symfony UX 3.5 est sorti le 21 septembre 2026, avec près de quatre-vingt-dix pull requests fusionnées depuis la 3.4 — l'une des plus grosses versions du projet selon ses mainteneurs. Deux points dominent : un composant de pagination, réclamé depuis des années, et un changement de rendu qui touche tous les composants Twig.
La pagination, enfin
symfony/ux-pagination, contribué par Simon André, pagine un tableau, une
requête Doctrine ORM ou DBAL, ou toute source placée derrière un
PaginatorInterface qui lit la requête HTTP. PHP construit la requête, Twig
rend une navigation accessible, et le navigateur suit de simples liens — ni
Stimulus, ni Turbo, ni JavaScript.
Trois stratégies, à choisir selon ce que la page doit garantir :
| Stratégie | Quand l'utiliser |
|---|---|
| Numérotée | Il faut un total exact et des numéros de page |
| Lookahead | Un lien « suivant » fiable suffit : pas de requête COUNT |
| Curseur bidirectionnel | Les lignes bougent pendant que l'utilisateur navigue |
Le composant <twig:ux:pagination> est livré avec des thèmes par défaut,
Bootstrap et Tailwind, des traductions en dix langues, une sérialisation JSON et
une intégration LiveComponent optionnelle via ComponentWithPaginationTrait. Le
bundle est expérimental : l'API peut encore bouger.
Le changement qui casse vos tests
ComponentAttributes avait sa propre logique de rendu des attributs, partielle
et parfois invalide : exception sur null, aria-* à false supprimé, booléen
true rendu nu, exception sur les tableaux et les enums. Hugo Alliaume l'a
remplacée par celle de html_attr(), que Twig maîtrise depuis sa 3.24 ; c'est la
3.29 qui a exposé la brique nécessaire. {{ attributes }} et
attributes.render() produisent désormais exactement ce qu'un template Twig
ordinaire produirait.
L'application ne casse pas, mais les tests qui comparent le HTML rendu
échouent : booléens, null, aria-* et valeurs non scalaires sortent
autrement. ux_icon(), <twig:ux:icon>, ux_map() et <twig:ux:map> suivent
le même chemin. En prime, UX Icons corrige un défaut d'accessibilité : un
aria-label, aria-labelledby ou title omis empêchait l'ajout automatique de
aria-hidden="true", laissant l'icône ni décrite ni masquée.
Autre changement de balisage : l'analyse SVG passe de \DOMDocument à
\Dom\XMLDocument, l'API de PHP 8.4, qui conserve l'attribut xmlns que
l'ancienne perdait sur les icônes locales.
Dépendances requises pour ce nouveau rendu : twig/twig 3.24 ou plus et
twig/html-extra 3.29 ou plus.
Le reste de la version
- Twig 4 pris en charge par dix paquets UX (Autocomplete, Cropper.js,
Dropzone, Icons, LiveComponent, Map, StimulusBundle, Toolkit, Turbo,
TwigComponent). Effet de bord bienvenu : sous Twig 4,
'App\Entity\Book'passé àturbo_stream_from()n'est plus amputé de ses antislashs. - Autocomplete sans Doctrine : implémenter
AutocompleterInterfacesuffit ; la routeux_entity_autocompletedevient un alias déprécié deux_autocomplete. - LiveAction :
LiveResponse::remove()retire le composant de la page,downloadUrl()etdownloadFile()déclenchent un téléchargement. - Dropzone accepte
multiple; Cropper.js passe à Intervention Image 3 et 4, avec pilotegd,imagickouvips. - Documentation des props lue depuis les commentaires
##de Twig 3.29. - UX Toolkit : vingt recettes Shadcn de plus, les premiers blocs
(
login-01,login-02), et la recettetypographyretirée.
Comment s'y prendre
- Monter
twig/twigettwig/html-extraaux versions requises. - Lancer la suite de tests et régénérer les assertions qui portent sur le HTML des composants, icônes et cartes.
- Vider le cache des icônes après la mise à jour.
- Tester
ux-paginationsur une page non critique, le temps qu'il sorte de l'expérimental.
Source : Symfony UX 3.5 released, blog Symfony, 21 septembre 2026.