Grâce à Conserto, nous venons maintenant depuis plusieurs années au SymfonyLive Paris et nous sommes toujours aussi satisfaits de participer à cet évènement qui s’adresse aussi bien aux développeurs débutants qu’aux développeurs confirmés. C’est le petit boost de début d’année qui nous remotive toujours pour aller plus loin dans notre expertise sur le framework et nous permet d’aller à la rencontre de la Core Team qui est toujours disponible pour répondre à nos questions.

Ouverture de l’événement

Comme chaque année, c’est Fabien Potentier qui a fait l’ouverture des conférences avec une keynote sur l’optimisation du MessengerComponent. Il propose une approche permettant d’apporter plus de simplicité pour des tâches récurrentes (notifications, mails) via un système de « scheduling » permettant de traiter en même temps la partie « dispatch » et la partie « worker/handler » des messages. Pour cela il a présenté le SchedulerComponent et l’utilisation du RecurringMessage.

💡 Ce nouveau composant arrivera avec la release 6.3 de Symfony en version expérimentale.

Focus sur les conférences

Console revisitée ❤️

Premier coup de cœur du salon avec la conférence de Robin Chalas sur la revisite du ConsoleComponent qui vient se rapprocher un peu plus du fonctionnement des Controller : pas d’implémentation obligatoire de l’abstraction Command et donc moins de couplage, de la configuration entièrement faisable via les attributs et une simplification de la gestion du style (SymfonyStyle), des flux (stdout/stderr) et des tests.

💡 On aurait aimé avoir en plus un accès au profiler, ce qui nous fait cruellement défaut aujourd’hui, surtout si vous utilisez Symfony uniquement avec des Command. Il nous a confirmé que c’était prévu, mais que c’était compliqué car le profiler est encore trop couplé au contexte HTTP. Sortie prévue si tout va bien sur la release 6.4 de Symfony.

Gestion des systèmes distribuées

La présentation de la gestion des systèmes distribués de Pascal Martin (BedRock) était plutôt intéressante. Pas de lien direct avec Symfony, mais des cas d’usages et des stratégies concernant forcément la majorité de nos applications.

💡 On aurait aimé avoir un parallèle avec le RuntimeComponent pour voir les différentes façons de distribuer une application Symfony par exemple.

Refonte de l’OMS x WorkflowComponent

Le retour d’expérience de Florence Cauchy (Sezane) sur la refonte de l’OMS avec l’utilisation du WorkflowComponent était très intéressant, surtout par rapport à mon activité actuelle sur le serveur de paiement de Carrefour. Ce composant était pour ma part inconnu, mais c’est justement ce que j’aime au SymfonyLive, découvrir ou redécouvrir des éléments nouveaux ou anciens mais qu’on a très peu, voire jamais, l’occasion d’utiliser.

Gestion asynchrone des réponses

En début d’après-midi Allison Guilhem (LesTilleuls) nous a présenté le point fort du Symfony HttpClient, à savoir la gestion asynchrone des réponses. Elle a profité de l’occasion pour faire un rappel des différentes fonctionnalités du composant, requêtes concurrentes, multiplexing, gestion des erreurs, avant d’introduire l’utilisation de l’AsyncDecoratorTrait qui donne les outils afin de garder un cadre asynchrone dans le traitement des réponses. En plus de la gestion asynchrone, Allison nous a montrés comment manipuler la réponse d’une requête principale en y injectant les réponses de deux autres endpoints d’API.

💡 Le sujet est très intéressant mais reste complexe à appréhender en 45 minutes et nécessitera quelques expérimentations pour comprendre toutes les subtilités.

SQLite

Guillaume Loulier nous a parlé de SQLite et de son utilisation en production. Un sondage rapide dans la salle a montré que quasiment personne ne le fait avec Symfony. Après la présentation des avantages/inconvénients, cela ne m’a pas vraiment convaincu. Les cas concrets adaptés à l’utilisation de SQLite en production restent limités. Ça ne résout pas les problèmes qu’on peut rencontrer sur MySQL ou PostgreSQL (performances, disponibilité, etc.). Les avantages (peu de code, portabilité 32/64bit, flexibilité, serverless, résilience des data, etc.) restent évidents dans certains contextes.

💡 C’était là le vrai but de la conférence : nous faire prendre conscience qu’il y a SQLite avec ses avantages et ses inconvénients, qu’il ne faut pas l’oublier au moment de faire un arbitrage technologique sur un projet.

Hotwire

Pour clôturer la première journée, Florent Destremau (Founder CTO chez Windoo) nous a présenté Hotwire à travers son expérience chez Windoo. Pas mal de cas concrets sur l’utilisation des Controller Stimulus et la manipulation du DOM.

💡Ayant déjà écrit 2 posts sur le sujet, j’aurais aimé plus d’informations sur les nouveautés apportées sur Symfony UX depuis 2021. Mais il est toujours bon de reparler de Symfony UX qui reste encore assez peu connu bien qu’il apporte énormément de possibilités sans avoir à passer par des frameworks JS lourd tel que Vue, React ou Angular.

Atypismes et discriminations

Pour débuter le deuxième jour, Magali Milbergue nous a proposé un plaidoyer sur les profils atypiques dans la tech et les discriminations qu’ils peuvent subir. Les points intéressants que j’ai retenus sont des exemples concrets : les annonces maladroites pour recruter des femmes, les évènements qui ne pensent pas à l’accessibilité des personnes handicapés, les capteurs des voitures autonomes qui détectent les personnes de couleur comme des obstacles non vivants contrairement aux personnes blanches ou bien encore l’utilisation de l’intelligence artificielle qui finit par retranscrire un sexisme virulent à travers son auto-apprentissage sur les données des années passées… Autant d’exemples qui montrent qu’il y a encore du chemin à faire, même au sein de la tech qui se présente souvent comme avant-gardiste sur le sujet.

Génériques en PHP

Karim Pinchon nous a ensuite proposé de parler des génériques en PHP, concept inconnu en ce qui me concerne et pourtant réclamé depuis longtemps par la communauté PHP. On parle donc ici de rendre paramétrable le typage des classes, des interfaces, des méthodes et leurs arguments en ajoutant une couche d’abstraction sur chaque type. L’avantage d’un typage strict mais flexible permettrait clairement de simplifier la documentation, de sécuriser le code en limitant la redondance et d’améliorer la maintenabilité d’un projet. Malheureusement, d’après « Nikita Popov » (un des principaux contributeurs de PHP), ce n’est pas pour demain car cela impliquerait une refonte trop importante côté PHP. En attendant, deux solutions sont présentées : l’utilisation des typages mixtes (PHP8+) ou l’utilisation des annotations (@template, @extends, @implements).

💡 On y voit clairement l’intérêt au niveau de notre IDE, pour les analyseurs statiques (PHPStan, PSalm) ou pour la couverture fonctionnelle. Mais cela reste « informatif », très verbeux et donc difficile à interpréter pour un développeur. Le sujet reste cependant très intéressant !

Maintenance et durabilité d’une API

Comment concevoir une API durable et maintenable, c’est ce dont Titouan Galopin est venu nous parler. Il nous a surtout présenté les bonnes pratiques permettant de découpler le contexte externe du contexte interne de l’API via l’utilisation de DTO et de Transformer. Comment versionner et déprécier afin de proposer des évolutions tout en maintenant une rétrocompatibilité dans le temps. Comment documenter son API afin de tenir informé ses utilisateurs des différentes évolutions. Il a présenté comment ils ont appliqué la norme « OpenAPI » chez Selency.

💡 Dommage de ne pas avoir donné d’exemples sur les outils évoqués pour contrôler la rétrocompatibilité des API v1 et v2 de manière automatique grâce à toutes ces bonnes pratiques.

Évolutions de Symfony UX ❤️

Deuxième coup de cœur du salon avec Kevin Dunglas qui est venu nous présenter la prochaine évolution de Symfony UX, où l’on pourra se passer de NPM/Node/Webpack (Encore). Un petit rappel rapide sur ce qu’est Symfony UX et Hotwire parce qu’on aime ça !

Puis, présentation du ImportMaps Component. L’idée est simple, en tirant partie des évolutions apportées par HTTP2+, plus besoin de précompiler ces fichiers CSS et JS puisque les navigateurs modernes vont être capable d’interpréter tout ce dont on a besoin pour utiliser Symfony UX. Le concept est issu directement du plugin du même nom sur ROR (rails/importmap-rails). L’isolation des modules JS va nous apporter une gestion plus optimisée du cache puisque nous n’aurons plus besoin de recompiler l’intégralité de notre JS global à chaque changement. Avec le multiplexing apporté par HTTP2+, chaque module sera chargé en parallèle par le navigateur, apportant des performances similaires au chargement d’un seul fichier JS global. La résolution des packages non-standard comme @hotwired/turbo se fera via un mapping sur un fichier importmap.php. Des commandes via le CLI permettront d’automatiser la configuration.

Concernant le preloading le travail est encore en cours. Une solution possible serait de passer par l’utilisation du status code 103 (Early Hints) afin de déclencher les pré-chargements côté navigateur avant même de recevoir la réponse HTTP finale. Le blocage vient de PHP-FPM pour le moment, mais peut être contourné en passant par d’autres distributions, comme FrankenPHP.

ImportMaps reste adapté dans le cadre de Symfony UX puisqu’on cherche toujours à s’affranchir le plus possible du JavaScript. Mais si vous êtes sur un projet avec du TypeScript ou du SASS/LESS/SCSS, alors NPM/Node/Webpack seront encore nécessaires. Les deux approches resteront évidemment possibles et optionnelles pour répondre à tous les besoins.

Écriture de tests

En début d’après-midi, Alexandre Salomé a partagé sa passion pour l’écriture des tests. Pour cela il a fait un rappel des différents types de tests existants : tests unitaires, tests d’intégrations et tests fonctionnels. Sa présentation était riche en exemples, il nous a montré entre autres comment tester un envoi d’email et son contenu, l’envoi d’un message par le composant messenger ou comment faire un bouchon du HttpClient afin de simuler la réponse d’une api externe.

💡 On retiendra les différentes astuces qu’il a donné durant sa conférence :

  • Utilisation du BrowserKitAssertionsTrait, DomCrawlerAssertionsTrait, MailerAssertionsTrait pour bénéficier de messages d’erreurs plus pertinents
  • L’annotation « @group time-sensitive » pour faire du clock mocking
  • L’utilisation de fixtures pour le développement, en privilégiant les tests auto-suffisants

Certification Symfony

Le retour d’expérience de Camille Jouan sur sa préparation au passage à la certification Symfony était le bienvenu, moi-même étant en cours de préparation. C’est un vrai challenge qui doit être bien préparé. Elle précise quand même qu’il est bon de se demander pourquoi et dans que but on se lance dans un tel projet car l’investissement pour y arriver est important. Elle a partagé avec nous sa méthodologie (roue de Deming), les évolutions dans son apprentissage et son adaptation aux imprévus (temps alloué sur le temps de travail/perso, date d’examen, passage blanc) ainsi que les outils qu’elle a utilisés et qui se sont révélés utiles ou au contraire chronophages et non-productifs.

💡 Globalement, la documentation officielle de Symfony, le « Fast-Track Book » et la pratique était le socle de sa préparation.

En conclusion : Rétrospective des améliorations

Comme l’année dernière, c’est Nicolas Grekas qui a clôturé ce SymfonyLive en nous proposant une petite rétrospective sur les améliorations apportées au frameworks en 2022. Les chiffres présentés par Nicolas sont impressionnants, 480 mineurs et 468 corrections de bug, 309 nouvelles fonctionnalités pour 360 contributeurs. Un grand bravo à lui pour le passage de sa 3000ème contribution.

💡 Dans les améliorations que l’on a appréciées :

  • Le passage à PHPUnit 10
  • L’ajout des composants Scheduler, Clock, ImportMaps, RemoteEvent et Webhook
  • La mise à disposition des attributs Cache, IsGranted, Template et MapEntity qui enterrent définitivement le SensioFrameworkExtraBundle
  • L’ajout des attributs pour mapper les paramètres de requêtes
  • L’ajout des attributs pour définir les codes d’erreur des exceptions ainsi que le niveau de log
  • Le support des arguments nommés pour le dump()
La team Conserto au SymfonyLive 2023 💗