veilletech.fr
14 nov. Feed du jour
#04 SYMFONY Article

Symfony 8.2 : le Validator en six retouches

Une règle de validation tient maintenant dans son attribut.

Le billet « New in Symfony 8.2 » consacré au Validator rassemble six changements : règle Callback en ligne, Unique sur des objets, nombres BcMath, paramètres de violation non textuels, séquences de groupes et cascade plus souple. Symfony 8.2.0-BETA2 est sortie le 13 novembre. La règle écrite dans l'attribut demande PHP 8.5.

3 min de lectureintermédiairevidéo 1:20
Partager
Sommaire5 sections
  1. Ce qui se passe
  2. Les six retouches
  3. Pourquoi ça compte
  4. Limites
  5. À retenir

Ce qui se passe

Le blog de Symfony consacre un billet de sa série « New in Symfony 8.2 » au composant Validator. Il arrive le jour de la sortie de Symfony 8.2.0-BETA2, une pré-version à tester avant la version finale. Six changements, la plupart faits pour supprimer du code répétitif.

Les six retouches

  1. Callback en ligne (Javier Eguiluz). La contrainte Callback gagne une option message. Quand elle est renseignée, le callback ne renvoie qu'un booléen, et Symfony fabrique la violation s'il répond false. Avec PHP 8.5, qui autorise les closures statiques dans les expressions constantes, toute la règle tient dans l'attribut.
  2. Unique sur des objets (Pierre-Louis Fort). L'option fields de Unique, qui vérifie l'unicité d'une collection sur certains champs seulement, ne marchait que sur des tableaux. Elle accepte maintenant des collections d'objets : les propriétés publiques sont lues directement, le reste passe par PropertyAccess, donc getters et chemins de propriétés fonctionnent.
  3. Nombres BcMath (MD. Saiful Islam Feroz). Range et les contraintes de comparaison (EqualTo, NotEqualTo, GreaterThan, GreaterThanOrEqual, LessThan, LessThanOrEqual) acceptent BcMath\Number, la classe de PHP 8.4 pour la précision arbitraire. Symfony convertit les bornes en BcMath\Number avant de comparer, car PHP tronque un flottant comparé à un Number.
  4. Paramètres non textuels (Pascal Cescon, PR #64367). Dans un validateur personnalisé, setParameter() n'acceptait que des chaînes, alors que setParameters() prenait n'importe quoi. Il accepte désormais string, int, float, \Stringable et \DateTimeInterface, ce qui sert avec le format de messages ICU, capable de formater nombres et dates.
  5. Séquences de groupes (naxvog, Pascal Cescon). Le groupe de la classe elle-même s'écrit avec ::class plutôt qu'avec son nom court ('Order'), une chaîne facile à oublier lors d'un renommage. Et la nouvelle option cascadeCurrentGroup valide les objets référencés par Valid contre le groupe courant de la séquence, alors qu'ils n'étaient validés que contre Default. Elle existe aussi en YAML, en XML et dans #[Assert\GroupSequenceProvider].
  6. Cascade plus souple (Nicolas Grekas, Antonio Pauletich). L'option groups de Valid déclenche la cascade et restreint les contraintes vérifiées sur l'objet imbriqué, ce qui rend un objet réutilisable difficile à écrire. Avec restrictGroups à false, les groupes ne servent plus qu'à déclencher la cascade. Par ailleurs, Valid peut vivre dans Sequentially, utile pour une valeur de forme variable qu'on ne descend qu'après un premier contrôle ; la contrainte imbriquée ne définit alors pas ses propres groupes, c'est Sequentially qui les porte.

Le piège qui justifie la troisième retouche, d'après le billet :

PHP
use BcMath\Number;

var_dump(new Number('10.2') > 10.5); // bool(true) : 10.5 est tronqué à 10

Pourquoi ça compte

Aucune de ces retouches n'est spectaculaire, mais toutes touchent le quotidien : une règle d'une ligne sans classe dédiée, une collision de groupes dans une cascade, un montant qu'on ne veut pas passer en flottant. Les contraintes monétaires avec BcMath\Number y gagnent des comparaisons exactes.

Limites

Tout reste en pré-version : 8.2.0-BETA2 se teste en abaissant minimum-stability dans Composer, sur une copie du projet, pas en production. La règle écrite dans l'attribut suppose PHP 8.5, qui autorise les closures statiques dans les expressions constantes. Le code complet de chaque exemple est dans la source.

Source : Symfony, en anglais.