Ce qui se passe
Symfony UX 3.7 est sortie avec plus de 100 pull requests fusionnées depuis la 3.6. Le changement qui touche le plus de monde n'est pas une fonctionnalité : les pages riches en composants Twig coûtent nettement moins de CPU.
Pourquoi c'est plus rapide
- TwigComponent lit les métadonnées de composants sauvegardées par son cache warmer, au lieu de les reconstruire par réflexion à chaque requête, et copie moins de variables.
- LiveComponent ne lance plus ses écouteurs pour les composants qui ne sont pas live, et ne leur calcule plus d'identifiant à chaque re-rendu.
- Une propriété calculée qui renvoie
nullest désormais mise en cache, au lieu de relancer son calcul — requête comprise — à chaque accès.
Mesures de l'équipe sur un tableau de bord d'administration de 1 800 composants, dont 28 live (médianes de six séries alternées de 60 requêtes, environnement prod, PHP 8.4, Twig 3.30) :
| Requête | 3.6 | 3.7 | Écart |
|---|---|---|---|
| Tableau de bord, 25 lignes | 57,1-58,9 ms | 48,5-51,0 ms | −15 % |
| Tableau de bord, 100 lignes | 144,5-149,0 ms | 120,0-122,6 ms | −18 % |
| Cocher 3 lignes sur 100 | 158,0-162,1 ms | 85,5-87,5 ms | −46 % |
| Saisie dans la recherche | 51,4-51,8 ms | 30,0-31,2 ms | −40 % |
Le gain suppose des templates recompilés : un cache:clear suffit. La syntaxe HTML des composants se compile aussi
plus vite : réécrit autour d'un seul scanner, son pré-lexeur traite 672 templates réels en 32 % de temps en moins.
UX CSS, expérimental
Des classes utilitaires écrites en chaînes, à la Tailwind, ne signalent rien quand on les orthographie mal. UX CSS
donne à Twig une fonction css(), inspirée de Panda CSS : on lui passe des propriétés et des jetons de design, elle
renvoie des noms de classes atomiques. Chaque appel est validé : une propriété ou un jeton inconnu s'affiche en erreur
en debug, fait échouer lint:twig en CI et cache:clear au déploiement. Un appel sans valeur dynamique ne coûte
rien à l'exécution, ses classes étant figées dans le template compilé. La feuille de style est écrite par PHP, sans
Node.js, et fonctionne avec AssetMapper, Symfony Reprise et Webpack Encore.
Le reste de la version
- UX Image gagne deux serveurs d'images auto-hébergés, Imagor et IPX ; changer de fournisseur ne touche que le DSN.
- UX Toolkit sort de l'expérimental et suit la promesse de compatibilité de Symfony, sauf le contenu des recettes.
ux:installaccepte des optionscomponentsetcontrollerspour choisir où les fichiers atterrissent. - TwigComponent :
:messageseul vaut désormais:message="message". - LiveComponent : 13 corrections, dont des événements qui fuyaient d'une requête à l'autre sous FrankenPHP en mode
worker, et des dates impossibles comme
2026-02-31reportées sur une autre date au lieu d'être rejetées.
Ce qui peut casser
Dropzone écarte maintenant les fichiers déposés qui ne correspondent pas à l'attribut accept, ou qui dépassent la
nouvelle option max_files, et émet dropzone:reject. Certains changements modifient le comportement, notamment si
votre CSS règle display sur les parties du composant ou si accept ne liste que des types MIME. Lisez
UPGRADE.md de Dropzone avant de mettre à jour. UX CSS et UX Image restent expérimentaux : leur API peut bouger.
Source : blog Symfony. Source en anglais.