Pratique

Les nouveautés de Symfony 8.2

Les nouveautés de Symfony 8.2 qui ont leur exercice : formulaires, sécurité, événements, workflow, console et validation, chacune à réécrire dans le navigateur.

Chaque exercice part du code tel qu'on l'écrivait jusqu'ici et le réécrit avec la nouveauté. Côté formulaires, des champs déclarés par attributs sur un DTO et un type qui porte les deux bornes d'un intervalle ; côté sécurité, des jokers dans les clés de role_hierarchy ; côté événements, des écouteurs placés avec before et after plutôt qu'avec des priorités chiffrées. Un workflow se décrit dans une classe, avec #[AsWorkflow] et ses transitions en constantes. La console accepte des sous-commandes séparées par des espaces, PropertyAccess lit toute une collection avec [*], et une ValidationFailedException qui n'est pas attrapée donne une réponse 422.

Cette page rassemble les nouveautés qui ont un exercice, pas tous les changements de la version ; elle s'allonge à mesure que de nouveaux exercices paraissent. Les tests vérifient que le comportement attendu tient une fois le code réécrit.

  1. Un nom par version d'API, et des groupes à écarter #[SerializedName('nom', groups: 'v1')] : une propriété change de nom selon le groupe ; ignored_groups écarte un groupe sans toucher à la classe. SerializerAPI Faire l'exercice
  2. Un Cache-Control pour le CDN, un autre pour le navigateur $response->cacheControl('CDN') écrit un CDN-Cache-Control : le CDN, qu'on sait purger, garde la page longtemps ; le navigateur, non. HttpFoundationCache HTTP Faire l'exercice
  3. Un lien de réinitialisation qui ne sert qu'une fois UriSigner::sign() accepte une « version » : signez le lien avec l'empreinte du mot de passe, et il meurt dès que le mot de passe change. HttpFoundationSécurité Faire l'exercice
  4. Des écouteurs qui se placent les uns par rapport aux autres #[AsEventListener(after: …, before: …)] : l'ordre des écouteurs se dit par leurs noms, plus par des priorités devinées. EventDispatcher Faire l'exercice
  5. Des rôles par famille, avec des jokers ROLE_BLOG_* : une clé de role_hierarchy couvre toute une famille de rôles, y compris ceux qui ne sont déclarés nulle part. SecurityRôles Faire l'exercice
  6. Un champ pour une période, avec BoundsType Deux dates et la règle qui les ordonne tiennent dans un seul champ : plus d'écouteur POST_SUBMIT pour comparer les bornes à la main. Formulaire Faire l'exercice
  7. Des abonnés lisibles : method et priority ['tracer', 100] devient ['method' => 'tracer', 'priority' => 100] : getSubscribedEvents() dit enfin ce que contient chaque case. EventDispatcher Faire l'exercice
  8. Décrire un formulaire par attributs Les champs d'un formulaire se déclarent sur le DTO, juste à côté des contraintes de validation : plus de classe de formulaire pour les cas simples. FormulaireDTO Faire l'exercice
  9. Laisser remonter une ValidationFailedException Une ValidationFailedException non attrapée donne désormais une 422 avec la liste des violations : plus besoin de l'envelopper. ValidatorAPI Faire l'exercice
  10. Lire toute une collection avec [*] Un chemin comme [*][membres][*][email] remplace les boucles imbriquées : PropertyAccess lit chaque élément d'une collection. PropertyAccess Faire l'exercice
  11. Des sous-commandes à la Docker tenant --name=acme users list : le groupe porte l'option une seule fois, chaque sous-commande la lit dans la chaîne des commandes. Console Faire l'exercice

← Toute la Pratique