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
- Callback en ligne (Javier Eguiluz). La contrainte
Callbackgagne une optionmessage. Quand elle est renseignée, le callback ne renvoie qu'un booléen, et Symfony fabrique la violation s'il répondfalse. Avec PHP 8.5, qui autorise les closures statiques dans les expressions constantes, toute la règle tient dans l'attribut. - Unique sur des objets (Pierre-Louis Fort). L'option
fieldsdeUnique, 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. - Nombres BcMath (MD. Saiful Islam Feroz).
Rangeet les contraintes de comparaison (EqualTo,NotEqualTo,GreaterThan,GreaterThanOrEqual,LessThan,LessThanOrEqual) acceptentBcMath\Number, la classe de PHP 8.4 pour la précision arbitraire. Symfony convertit les bornes enBcMath\Numberavant de comparer, car PHP tronque un flottant comparé à unNumber. - Paramètres non textuels (Pascal Cescon, PR #64367). Dans un validateur personnalisé,
setParameter()n'acceptait que des chaînes, alors quesetParameters()prenait n'importe quoi. Il accepte désormaisstring,int,float,\Stringableet\DateTimeInterface, ce qui sert avec le format de messages ICU, capable de formater nombres et dates. - Séquences de groupes (naxvog, Pascal Cescon). Le groupe de la classe elle-même s'écrit avec
::classplutôt qu'avec son nom court ('Order'), une chaîne facile à oublier lors d'un renommage. Et la nouvelle optioncascadeCurrentGroupvalide les objets référencés parValidcontre le groupe courant de la séquence, alors qu'ils n'étaient validés que contreDefault. Elle existe aussi en YAML, en XML et dans#[Assert\GroupSequenceProvider]. - Cascade plus souple (Nicolas Grekas, Antonio Pauletich). L'option
groupsdeValiddéclenche la cascade et restreint les contraintes vérifiées sur l'objet imbriqué, ce qui rend un objet réutilisable difficile à écrire. AvecrestrictGroupsàfalse, les groupes ne servent plus qu'à déclencher la cascade. Par ailleurs,Validpeut vivre dansSequentially, 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'estSequentiallyqui les porte.
Le piège qui justifie la troisième retouche, d'après le billet :
use BcMath\Number;
var_dump(new Number('10.2') > 10.5); // bool(true) : 10.5 est tronqué à 10Pourquoi ç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.