veilletech.fr
3 nov. Feed du jour
#02 SYMFONY Article

Symfony 8.2 : expressions compilées et validées

Une expression fausse n'attendra plus la production pour se plaindre.

Symfony 8.2 compile les expressions ExpressionLanguage en PHP au réchauffement du cache : une évaluation passe d'environ 15-30 µs à 1 µs, sans changer le code. Les expressions invalides font échouer le réchauffement, et une commande lint:expressions les contrôle en CI. Les fonctions constant() et enum() sans restriction sont dépréciées au profit d'un ConstantFunctionProvider.

2 min de lectureintermédiairevidéo 1:24
Partager
Sommaire5 sections
  1. Ce qui se passe
  2. Des expressions compilées en PHP
  3. Des erreurs détectées avant la production
  4. Limiter l'accès aux constantes
  5. À retenir

Ce qui se passe

Le composant ExpressionLanguage fait tourner une bonne partie de Symfony : les attributs #[IsGranted] et #[Cache], les règles access_control, les gardes de workflow. Symfony 8.2 le rend plus rapide, plus sûr et signale les erreurs avant la production. Trois changements, tous annoncés par le blog officiel.

Des expressions compilées en PHP

Jusqu'ici, Symfony mettait les expressions analysées en cache, mais chaque évaluation devait encore les reconstruire depuis ce cache : 15 à 30 µs, autant que de les analyser de nouveau. Les gardes de workflow n'étaient pas mises en cache du tout.

En 8.2, toutes ces expressions sont compilées en PHP au réchauffement du cache. Évaluer revient à appeler une méthode statique : environ 1 µs, le coût d'une closure équivalente. Aucun changement n'est demandé à l'application, et la compilation est désactivée en mode debug, ce qui permet de modifier des fonctions d'expression sans vider le cache.

Des erreurs détectées avant la production

Une expression est une chaîne : une faute de frappe ne se voit qu'à l'évaluation. En 8.2 :

Terminal
php bin/console lint:expressions

Limiter l'accès aux constantes

Une expression ne lit que les variables qu'on lui passe, sauf constant() et enum() : elles lisent n'importe quelle constante ou case d'enum de l'application. Quand les expressions viennent d'utilisateurs, cela peut exposer des valeurs sensibles comme des clés d'API.

Symfony 8.2 ajoute un ConstantFunctionProvider qui restreint les deux fonctions aux constantes autorisées. L'étoile * remplace tout sauf ::. Les noms sont vérifiés avant la lecture, donc une classe hors liste n'est jamais chargée par l'autoloader.

Source : blog Symfony, de Nicolas Grekas. Source en anglais.