Retour au Blog

Symfony 6.3 : les nouveautés dans le développement web

Symfony 6.3 : les nouveautés dans le développement web

Réputé pour son architecture modulaire, sa flexibilité et sa large gamme de composants réutilisables, le framework Symfony a dévoilé fin mai sa dernière version, Symfony 6.3. Depuis sa dernière mise à jour majeure en novembre 2021, Symfony ne cesse de trouver des axes d'amélioration.

Tout au long du mois de mai, des versions bêta de la version 6.3 ont été publiées, aujourd’hui, nous prenons le temps de vous parler des nouveautés de la dernière mise à jour intermédiaire qui nous semble intéressantes à explorer. 

Les Early Hints 

Cette fonctionnalité mise en ligne par HTTP permet à un serveur web d'envoyer des informations supplémentaires à un client avant l'envoi de la réponse complète. Les Early Hints, ou “préconseils” en français, sont une nouveauté importante dans Symfony 6.3.

Suite à la prise en charge par sendEarlyHints(), celui-ci envoie la première réponse HTTP, sous le code 103. Par la suite, il vous renvoie le Responseobjet à utiliser pour pouvoir envoyer la réponse complète. Cette nouveauté accélère largement le chargement des applications web, les utilisateurs n’en seront que plus satisfaits. 

Point de vue sécurité

Les NoSuspiciousCharacters

Les no suspicious characters sont des caractères différents, par un détail minime, mais similaires à notre alphabet. Ils sont utilisés dans les attaques par homographe IDN. C’est une technique d’attaque informatique qui utilise des noms de domaines proches de noms de domaines légitimes en utilisant des caractères Unicode, cela permet de tromper les utilisateurs et de récolter leurs informations à leur insu. Par exemple, dans un nom de domaine, déposé par une tierce personne, certains caractères peuvent être remplacés ; le chiffre 0 à la place de la lettre “o”. Les caractères de remplacement peuvent être aussi issus de l’alphabet cyrillique, grec ou encore latin. 

Symfony 6.3 offre la possibilité de vérifier et valider que les chaînes ne contiennent pas de caractères qui pourraient poser problème. 

Basé sur la Spoofcheckerclasse fournie par l’extension PHP intl, voici un modèle de son fonctionnement ;

Le gestionnaire de jetons/tokens OpenID Connect 

New in Symfony 6.3: OpenID Connect Token Handler

Introduit dans la version 6.2, l’authentificateur permet de récupérer des jetons d’accès grâce aux informations d'identification de l’utilisateur. Celui-ci est généralement inclus dans les en-têtes des requêtes HTTP. Ces jetons d’accès offrent une méthode sécurisée de gestion des connexions aux applications Symfony.  

Dans Symfony 6.3, une implémentation de ce mécanisme a été introduite pour interagir avec les serveurs OpenID Connect, pour vérifier l’autorisation d’accés.

OidcUserInfoTokenHandlerOidcUserInfoTokenHandler appelle votre serveur OIDC et récupère les informations de l’utilisateur. 

En configurant ces éléments, Symfony crée un client HTTP, pour pouvoir gérer les requêtes HTTP nécessaires à l’authentification.   

En supplément, Symfony a ajouté un générique OidcTokenHandler qui permet de décoder le jeton donné, le valider et récupérer les informations présentes dessus. Il suffit d’ajouter quelques lignes de configuration comme ci-dessous ;

L’amélioration de la connexion et de la déconnexion 

  • Redirection personnalisée avec connexion programmatique : introduite dans la version précédente, la méthode login() facilite la connexion des utilisateurs. La personnalisation de la réponse après la connexion de l’utilisateur n’était pas possible car la méthode renvoyait void. 

Dans Symfony 6.3, la méthode login() est apte à envoyer une Response à l’objet en question. On gagne un peu de temps dans notre conception. 

  • Une Option a été ajoutée également “Se souvenir de moi pour les connexions JSON” : la connexion JSON fournie par Symfony est très populaire chez les utilisateurs. Elle permet la création de jetons de sécurité pour un utilisateur donné. 

La fonctionnalité offre la possibilité de stocker des informations d’identification dans un cookie signé pour éviter à l’utilisateur d’avoir à les fournir à nouveau.

Symfony 6.3 fusionne ces 2 fonctionnalités, permettant alors aux connexions JSON la prise en charge de cette fonctionnalité de sécurité. il suffit simplement d’ajouter une clé _remember_me dans la requête POST : 

Ce qui est assez pratique pour les logins via JSON.

  • Effacer les données du site après la déconnexion : la prise en charge de l’en-tête HTTP, qui efface les données de navigation, est maintenant disponible dans Symfony 6.3, via la configuration logout des pare-feux : 

Ce qui permet aussi de clarifier les données des utilisateurs, en cache, en cookie pour mieux les protéger.

La contrainte de la force des mots de passe

Blog - New in Symfony 6.3: Password Strength Constraint

Les mots de passe sont un élément essentiel sur de nombreux sites web ou applications, la question de la sécurité revient donc assez souvent sur ce sujet. En 2019, Symfony avait introduit une contrainte qui permettait de vérifier qu’un mot de passe n’est pas compromis suite à une fuite de sécurité. 

Dans la version 6.3, une nouvelle contrainte est introduite pour valider la force des mots de passe donnés. La vérification s’effectue sur l’entropie du mot de passe donné pour voir s'il atteint un certain seuil de sécurité. Cette contrainte peut être particulièrement utile pour vos clients. 

Quatre niveaux sont à configurer pour obtenir un mot de passe de force moyenne : 

Au niveau performance

Les attributs d’exception HTTP

Utilisés pour définir les caractéristiques ou les données d’un objet, les attributs peuvent aussi être utilisés pour stocker des informations spécifiques à cet objet. Au  lieu d’avoir à ajouter la configuration dans un fichier séparé, les attributs PHP définissent les métadonnées lisibles par machine dans le code. Dans la dernière version de Symfony, un ajout de nouveaux attributs a été réalisé pour configurer les exceptions HTTP. 

Pour créer ses propres exceptions HTTP, il fallait, dans l’ancienne version, implémenter HttpExceptionInterface et la configurer dans l’option framework.exceptions

Grâce à la mise à jour, le code et la configuration vus ci-dessus sont toujours disponibles, mais ils sont remplaçables par ces attributs PHP : 

Il n’y a plus la nécessité de configurer des éléments dans l’option framework.exceptions. Toutes les informations sont réunies en un seul fichier. De plus, les exceptions de domaine sont découplées du code d’infrastructure grâce au composant HttpKernel. 

Ce qui est clairement super pratique aussi.

Le mappage des données de requête aux objets typés

Suite à une demande récurrente quant au mappage, Symfony 6.3 offre enfin la possibilité grâce à de nouveaux attributs de mapper les requêtes sur les objets typés (par exemple les ODT, Objet de Transfert de Données) et de les valider ensuite, tout cela en utilisant l’attribut #[MapRequestPayload].

Les erreurs de validation, les données malformées ou encore les formats de désérialisation non pris en compte, recevront des réponses d’erreur HTTP adaptées. 

Les résolveurs de valeurs ciblées

Symfony offre un large panel de résolveurs intégrés, qui servent à injecter certaines valeurs dans les arguments des contrôleurs. Ces injections peuvent être des services, des valeurs UID, les valeurs PHP, et plus encore. Suite à la mise à jour Symfony 6.3, cette fonctionnalité sera d’autant plus puissante. 

Un attribut ValueResolver a été introduit, il permet la sélection immédiate du résolveur, dont le nom est leur FQCN, par exemple SessionValueResolver::class, à utiliser pour obtenir la valeur de cet argument. 

D’autre part, un nouvel attribut AsTargetedValueResolver a également été ajouté. Celui-ci crée des résolveurs qui ne peuvent être appelés qu’explicitement. 

Le Request Payload 

Les Request et Response sont une fonctionnalité essentielle chez Symfony, ils permettent d’utiliser un objet pour obtenir et définir des informations dans ce composant, à défaut de gérer les tableaux PHP (sous-jacents/ implicites).

Symfony 6.3 propose une méthode alternative à l’expression $request->request->..., celle-ci menait à confusion certains utilisateurs. La remplaçante est appelée la méthode getPayload() et renvoie un objet InputBag. 

La méthode $request->request->... est cependant conservée pour les utilisateurs qui s’y sont habitués, et surtout pour ne pas modifier des projets existants. 

La commande de débogage du sérialiseur 

Le composant Serializer est utilisé pour la sérialisation et la désérialisation des objets. Il permet de convertir des objets PHP en différentes représentations, telles que JSON, XLM ou encore YALM, et ce, dans les deux sens. C’est un composant reconnu pour être puissant, mais complexe par la même occasion, ce qui peut compliquer le débogage de certaines situations. 

Dans Symfony 6.3, une nouvelle commande a été ajoutée, debug:serializer, elle permet de vider les métadonnées d’un sérialiseur d’une classe donnée, ce qui nous aide à détecter n’importe quel problème dans la configuration des métadonnées. 

Cette commande rejoint l’ensemble des debug fournies par Symfony ; 

L’amélioration des énumérations 

Depuis l’introduction de la prise en charge des énumérations sous Symfony 5.4, le composant ne fait que s’améliorer. 

  • Une fonction enum() a été ajouté au composant Expression Language, elle permet d’obtenir des casses à l’intérieur des expressions, comme ci-dessous ;  
  • En utilisant composant config, il est dorénavant possible d'utiliser des valeurs enum selon la méthode enumNode(); 

  • Dernier ajout, les énumérations comme valeurs par défaut des arguments de route. Cette fonctionnalité apparue dans la version précédente est ici améliorée. En plus de ça, le parameter bag utilisé pour obtenir des valeurs de la demande d’ajout d’une getEnum(). Cela permet de convertir les valeurs d’une chaîne de requête en cas d’énumération sauvegardée :

Le mappeur de paramètres de requête 

Une fonctionnalité permettant de mapper les données de requête des objets typés a été introduite dans Symfony 6.3, grâce aux attributs #[MapRequestPayload] et #[MapQueryString]. Il est également possible de mapper des paramètres de chaîne de requête à des arguments de contrôleur spécifiques. 

Ce qui est sacrément pratique, plutôt que de faire des contraintes, ou de tout vérifier à la main.

Les améliorations de la performance 

La performance de la base de code est un point en constante amélioration sur Symfony, dans la dernière version des modifications ont été apportées ; 

  • L’extraction des messages de traduction : la commande de translation:extract permet l’analyse de l’ensemble des fichiers d’une application pour y trouver le contenu qui peut être traduit, pour pouvoir y mettre à jour les fichiers de traduction. Malgré la praticité, cette commande peut se montrer plus lente selon la taille des bases de code dû à l’utilisation d’un AST (Arbre de Syntaxe Abstrait).

Ce processus d’extraction a été mis à jour dans Symfony 6.3, pour générer des fichiers AST pour PHP contenant des éléments liés à la traduction. 

  • Autoriser la désactivation du vidage XML du conteneur : lorsqu’on utilise le mode débogage, Symfony compile les informations du conteneur de services dans un fichier XML. Plusieurs commandes utilisent ce fichier : 
  • config:dump-reference
  • debug:autowiring
  • debug:container
  • debug:router
  • lint:container

Grâce à la configuration de l’option debug.container.dump, en définissant le false, cela permet de ne plus vider les informations du conteneur dans un fichier XML. 

  • Les normalisateur et dénormalisateurs du sérialiseur : le composant Serializer prend en compte les tableaux PHP comme représentation intermédiaire entre les objets et leur contenu sérialisé. Les normalisateurs/dénormalisateurs sont là pour transformer les objets en tableau et sens inverse. 

La méthode getSupportedTypes(?string $format): array, nouvelle dans Symfony 6.3, permet à ceux-ci de déclarer le type d’objets qu’ils peuvent gérer et s’ils peuvent être mis en cache. Dépendant de l’application, les performances montrent une forte amélioration. 

Les améliorations des Emoji

Les emojis sont partout même dans l’environnement des entreprises, dans Symfony 6.3 certaines fonctionnalités emoji ont été améliorées. 

  • Retirer les émoticônes des chaînes : certaines applications ne prennent pas en compte ou n’acceptent pas les emojis envoyés par les utilisateurs. Malgré ça, séparer les emojis du contenu de la chaîne prend du temps inutilement dans l’utilisation d'expressions régulières.  

Dans Symfony 6.3, une fonctionnalité a été ajoutée pour supprimer les emojis d’un contenu de chaîne donné. Cette fonctionnalité est appliquée avec une nouvelle locale artificielle, strip,  intégrée dans la classe de translittération emoji : 

  • Compresser les données Emoji : Des règles de remplacement ont été introduites en utilisant les 5 000 emojis définis dans le projet Unicode. Elles sont mises à jour automatiquement et donc contiennent toujours les emojis officiels. Cependant, cette fonctionnalité prend une place considérable sur l’espace disque. 

Symfony 6.3 offre un nouvel outil qui permet de compresser par nous-même les données emoji : 

Les composants Webhook et RemoteEvent 

Le mécanisme d’un Webhook permet à une application d’envoyer automatiquement des notifications à une autre application via des requêtes HTTP. Chez Symfony, c’est un moyen d’interaction qui déclenche des actions en réponses à des évènements spécifiques.

Étant très utilisés pour leur praticité, deux nouveaux composants ont été ajoutés: Webhook, défini comme analyseur + consommateur, et RemoteEvent. 

La Clock 

La clock a été introduite dans Symfony 6.2, ici dans la version 6.3 elle a été améliorée. Ce composant Clock est là pour découpler les applications de l’horloge système, dans l’idée de créer des tests plus sensibles au temps. 

  • Introduction  Clock classe + know () fonction: 

Cette nouvelle fonctionnalité offre l’heure actuelle et PSR-20: Clock permet de programmer facilement toutes implémentations disponibles sur l’interface décrite comme horloge globale dans votre application.

La fonction now() a aussi été mise en place, celle-ci peut être utilisée n’importe où dans votre application pour avoir l’heure exacte

Pour que les fonctionnalités Clock classe et now() donnent le même horaire, Symfony câble cette horloge globale comme un service, ce qui peut être utile dans certains cas.

  • Ajout d’un ClockAwareTrait : 

Cette interface permet certes de mettre à jour les services nécessitant un horaire précis, mais pour éviter aux développeurs qui ne souhaitent pas injecter de nouvelles dépendances dans les logiciels en codage, un trait (sorte de composant réutilisable) a été ajouté pour que cette fonctionnalité puisse être utilisée plus facilement. 

Cette prise en charge de l’horloge est aussi disponible sur d’autres composants, comme Message Workers ou encore DateTime. 

Améliorations de WebProfiler 

  • Premier changement quasiment invisible pour la plupart des utilisateurs, les liens et onglets sont maintenant accessibles, cela est possible grâce à une meilleure utilisation d’éléments HTML et d’un code JavaScript qui permettent de créer et gérer les onglets. 
  • Les dates et heures sont désormais affichées dans notre fuseau horaire. Javascript effectue une conversion automatique lors du chargement des pages de profileur. 
  • La dernière modification du profileur symfony 6.3 est visible dans le panneau Twig, qui permet de voir la “vue d’entrée”, autrement dit le modèle rendu principal, grâce à un lien cliquable, pour accéder plus rapidement à notre IDE.

Conclusion

Symfony 6.3 est sortie le 30 mai dernier, il faudra un peu de temps pour que cette version soit utilisée couramment dans les projets Symfony. Vous pouvez consulter toute la documentation sur le blog Symfony, et nous restons à votre disposition pour tous services de développement d’applications web.

Il s’agit ici d’une mise à jour mineure, voici la documentation Symfony qui vous explique les étapes à suivre, vous pouvez également vous aider de notre article sur la migration d’un projet d’une version à une autre.

Pour réaliser une application sous Symfony 6.3, n’hésitez pas à prendre contact avec nous.

Contactez-nous !
Je veux en savoir plus !