Retour sur l'AFUP Day 2023
Publié le 26 mai 2023
Il y a quelques jours notre équipe a participé en simultané à l’AFUP Day, le rendez-vous printanier de l’AFUP organisé par ses antennes locales. Cette année, l’événement se déroulait à Lille et à Lyon et a rassemblé plus de 400 participantes et participants. Découvrons ensemble les conférences qui nous ont marquées.
Doctrine, objet typé, et colonne JSON #
Grégoire Pineau a présenté une étude de cas portant sur l'utilisation de blocs dans un CMS sans duplication de code ni de données dans la base de données, tout en évitant une complexification excessive de la base de données via les jointures.
Il présente plusieurs solutions, telles que la création d'une seule table, mais cela n'est pas viable car cela entraînerait trop de champs vides. Une autre solution consiste à utiliser la sérialisation d'objets PHP (avec le sérialiseur Symfony) en JSON dans la base de données, mais ce n'est pas la meilleure approche.
Il en vient à la conclusion de créer une extension personnalisée du type JSON avec Doctrine, mais il rencontre un problème : lorsqu'il édite un bloc, aucune requête n'est effectuée. Pour résoudre ce problème, il a mis en place un listener Doctrine qui utilise les fonctions postLoad, postPersist, onFlush et onClear pour permettre la modification des blocs.
Le Zéro Downtime Deployment en pratique #
Smaïne Milianni nous a partagé les bonnes pratiques en matière de “Zéro Downtime Deployment”, ou l’art de pouvoir déployer n’importe quand sans risquer de coupure de service. La pratique consiste à toujours maintenir une compatibilité entre la version “N” et la version “N+1” et n’est pas sans rappeler la promesse de rétrocompatibilité de Symfony. Elle s’articule en particulier autour de trois sujets : le schéma de base de données, les messages envoyés dans un message broker de type RabbitMQ ou SQS et le contrat d’API.
Parmi les exemples cités :
- Ne jamais ajouter directement une colonne SQL
NOT NULL
, mais dans un premier temps, autoriser le null, remplir le champ, et ensuite rendre la colonneNOT NULL
- ne pas modifier la classe d’un message, mais passer par une étape intermédiaire où l’ancienne classe et la nouvelle classe cohabitent, mais ne plus émettre de message avec l’ancienne classe.
Smaïne préconise également de créer les deux pull requests des version N
et N+1
en même temps, afin de ne pas oublier la seconde étape. Vous trouverez toutes les informations pour être “ZDD compliant” sur son article de blog.
Du vrai serverless, ou comment faire tourner PHP dans le navigateur pour documenter API Platform #
Notre coopérateur Antoine Bluchet nous a aussi montré comment il a réussi à faire fonctionner PHP dans un navigateur. Cette idée lui est venue d’un constat récurrent, y compris sur API Platform : la documentation en ligne de nos bibliothèques est généralement mal écrite, voire inexistante. Pourtant, nous avons tous les outils pour les documenter directement dans notre code : commentaires, PHPDoc…
C’est une bonne opportunité pour pratiquer le literate programming, qui consiste à commenter tout le code pour décrire ce qu’il fait de façon détaillée. Avec un script interprétant ces commentaires, il devient possible d’en extraire une documentation très précise de chaque fonctionnalité, avec le code associé. Antoine a ensuite souhaité donner la main au visiteur pour modifier le code de la documentation à la volée, et bien sûr l’exécuter à la manière de 3v4l.org, mais dans le navigateur, ce qui l’a amené à se pencher sur WebAssembly.
Défini dans une spécification du W3C en 2017, il s’agit d’un environnement sécurisé, portable et de bas niveau permettant d’exécuter dans le moteur JavaScript du navigateur un programme écrit dans un autre langage comme du C, avec des performances proches de celles d’une application native. Ses travaux lui ont ainsi permis de faire fonctionner une application Symfony ou encore API Platform dans son navigateur Web, avec une prise en charge native du cache.
Le travail invisible en entreprise : le cas du glue work #
À Lyon, Camille Castillo de chez Elao nous a parlé du glue work : un terme qui désigne les tâches invisibles et souvent non reconnues que les employé·e·s accomplissent pour rendre l'entreprise plus productive et efficace.
Ces tâches incluent la gestion de projets, l'onboarding des nouveaux employés, la rédaction de documentation technique, l'organisation des réunions et des activités de Team Building. Les femmes sont souvent assignées au glue work et on leur demande de le faire plus souvent que les hommes.
Camille revient sur l'importance de sensibiliser les employés et les managers à cette charge de travail invisible afin de partager les ressources et bonnes pratiques pour éviter que cle travail ne soit toujours confié aux mêmes personnes. Les limites doivent être posées pour que le glue work ne devienne pas un fardeau trop lourd à porter et qu’une dynamique de partage soit instaurée.
Symfony Messenger et ses messages : à la queue-leu leu et s’il était temps de grouper ? #
Notre coopératrice Allison Guilhem nous présente une fonctionnalité méconnue du composant Messenger de Symfony : le traitement des messages par groupe. Cette fonctionnalité a été ajoutée dans Symfony 5.4.
Après avoir rappelé du vocabulaire spécifique au composant et quelques bonnes pratiques comme utiliser la commande debug:container
pour le débogage, le fait que les messages peuvent être consommés de manière synchrone ou asynchrone ou que par défaut, les messages sont traités un par un, Allison a expliqué qu’un besoin récurrent remonté par plusieurs utilisateurs était de pouvoir regrouper des messages, afin de pouvoir indexer plus efficacement de multiples documents (avec Elasticsearch par exemple), ou encore réduire le nombre d'appels API effectués. Cette fonctionnalité est maintenant disponible dans le composant et peut être implémentée par les gestionnaires. Pour ce faire, il leur suffit d’implémenter l'interface BatchHandlerInterface
, dont le trait BatchHandlerTrait
implémente quelques méthodes prêtes à l'emploi.
En résumé, Allison nous a expliqué que grouper les messages n'est pas adapté à toutes les situations. Cela présente cependant de gros avantages en termes de performance et de souplesse.
Transformer efficacement du JSON en structure PHP fortement typée #
Romain Canon nous a présenté sa bibliothèque Valinor. Cette bibliothèque est un mapper PHP qui dénormalise du json (ou des tableaux PHP) en objets fortement typés.
L’une de ses forces est de permettre de maintenir des objets dans un état valide de bout en bout, contrairement à certains de ses concurrents tels que le serializer de Symfony. La validation des inputs est appliquée récursivement et propose une granularité dans le traitement des erreurs.
Grâce à une compréhension des types avancés de la PHPDoc (generics, shaped arrays, integer range et bien d'autres), Valinor permet une grande compatibilité avec les outils d’analyse statique tels que PHPStan ou Psalm.
Protégez-vous des attaques sur la chaîne logistique grâce à Composer #
Kévin Dunglas a sensibilisé sur une attaque encore peu répandue, mais aux possibilités dévastatrices : les attaques sur la chaîne logistique (ou supply chain attack).
Une application repose sur des dépendances plus ou moins nombreuses, qui elles-mêmes définissent leurs propres dépendances, dites transitoires. Mais il arrive que parmi ces dépendances transitoires se trouvent de petits projets tenus par une personne seule, sur son temps libre, sans la moindre reconnaissance. Cela n’est pas un problème si l’on fait confiance à l’auteur, cependant les mainteneurs de librairies doivent avoir conscience qu’en ajoutant une dépendance à leur projet, ils obligent leurs utilisateurs à faire confiance aveuglément à ces dépendances transitoires dont ils n’ont généralement pas conscience, et qui, si elles sont maintenues par (ou transmise à) une personne mal intentionnée, peuvent avoir un effet dévastateur sur la sécurité du produit. C’est ce que l’on appelle une attaque sur la chaîne logistique.
Pour éviter ces situations, il peut être tentant de tout réécrire, mais cela reviendrait à réinventer la roue sur plusieurs milliers d’années cumulées de travail. C’est en constatant que les attaques les plus fréquentes de ce type sont généralement basées sur l’ajout de dépendances transitives malveillantes que Kévin avait proposé l’ajout à Composer d’une fonctionnalité permettant de maintenir une liste de vendors et de paquets autorisés à s’installer, grâce à l’ajout de catégories trusted et trusted-dev au fichier composer.json. La feature n'a pas été acceptée mais le projet est toujours en cours de réflexion.
Rendez-vous au Forum PHP 2023 ! #
Que ce soit à Lille comme à Lyon, notre équipe a passé une journée riche en partage de connaissances. Les temps de pause nous ont également permis de (re)voir des connaissances et partenaires de longue date, le tout dans une ambiance très conviviale propre aux événements de l'AFUP. La journée de conférences s'est clôturée par l'annonce des dates du Forum PHP 2023 que nous sponsorisons en tant que sponsor Gold : rendez-vous les 12 et 13 octobre à Disneyland Paris ! Le CFP vient d'ouvrir, pensez à partager vos sujets 🎤