Retour sur le forum PHP 2024
Revivez les moments forts du Forum PHP 2024 avec l'AFUP ! Découvrez l'avenir du PHP et les innovations qui feront la différence.
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.
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.
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 ;
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 ;
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.
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.
Ce qui permet aussi de clarifier les données des utilisateurs, en cache, en cookie pour mieux les protéger.
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 :
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.
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.
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.
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.
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 ;
Depuis l’introduction de la prise en charge des énumérations sous Symfony 5.4, le composant ne fait que s’améliorer.
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.
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 ;
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.
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.
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 emojis sont partout même dans l’environnement des entreprises, dans Symfony 6.3 certaines fonctionnalités emoji ont été améliorées.
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 :
Symfony 6.3 offre un nouvel outil qui permet de compresser par nous-même les données emoji :
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 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.
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.
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.
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.