[{"content":" Plateforme métier, refonte applicative ou API stratégique : la technologie qui propulse votre projet doit être fiable, modulaire et pérenne. Spécialiste reconnue de l\u0026rsquo;écosystème Symfony, l\u0026rsquo;équipe AKAWAKA conçoit des architectures évolutives et maintient vos applications au plus haut niveau d\u0026rsquo;exigence technique. Notre engagement : du code maintenable, zéro dette technique invisible, et des architectures pensées pour votre métier. Pas de bricolage éphémère : uniquement du développement pérenne et documenté. Pourquoi Symfony fait la différence sur vos projets critiques # Pour concevoir un outil métier complexe, un back-office sur mesure ou un écosystème connecté (ERP, CRM, PIM), les solutions génériques révèlent vite leurs limites : rigidité, dépendances excessives ou ralentissements à la montée en charge.\nVéritable référence du monde PHP, Symfony offre un cadre éprouvé, normalisé et ultra-sécurisé. Utilisé comme fondation par des solutions d\u0026rsquo;envergure (Sylius, Sulu, API Platform), il garantit une évolutivité sans compromis pour les entreprises qui refusent d\u0026rsquo;être bloquées par leur propre code.\nÉchanger sur votre projet Symfony Les atouts majeurs du framework # Composants modulaires Une suite de composants autonomes et réutilisables permettant d\u0026rsquo;intégrer uniquement les briques nécessaires, pour une application légère et maîtrisée. Interopérabilité totale Une architecture ouverte pensée pour s\u0026rsquo;interfacer naturellement avec vos systèmes tiers, vos bases de données existantes et vos API métiers. Sécurité et pérennité Un cycle de publication clair (versions LTS), une gouvernance de sécurité stricte et le soutien d\u0026rsquo;une immense communauté open-source mondiale. Nos domaines d\u0026rsquo;intervention Symfony # Chez AKAWAKA, nous n\u0026rsquo;appliquons pas de recettes standardisées : nous adaptons nos interventions au cycle de vie réel de votre application.\nConception Développement d\u0026#39;applications et plateformes sur mesure De la modélisation métier jusqu\u0026rsquo;à la mise en production, nous concevons des solutions logicielles modulaires, scalables et taillées pour vos usages. Performance Audit d\u0026#39;architecture, profiling et optimisation Votre application montre des lenteurs ou subit mal les pics de charge ? Nous auditons votre code, analysons les requêtes et levons les goulots d\u0026rsquo;étranglement pour retrouver une réactivité optimale. Modernisation Montée de version et maintenance pérenne Gestion sécurisée des migrations de versions majeures (Symfony 6, 7, 8) sans rupture de service ni perte de données, accompagnée d\u0026rsquo;un suivi de maintenance préventif. Transmission Coaching d\u0026#39;équipe et accompagnement aux bonnes pratiques Nous guidons votre équipe technique pour monter en compétences sur l\u0026rsquo;écosystème Symfony, automatiser les tests et adopter des standards de qualité durables. Notre signature technique : du code propre, pensé pour durer # Nous refusons les architectures jetables. Pour que vos développements restent faciles à faire évoluer au fil des années, nous appliquons rigoureusement les patterns logiciels modernes.\nArchitecture découplée (DDD \u0026amp; Hexagonal) Nous isolons votre logique métier des contraintes d\u0026rsquo;infrastructure et du framework pour protéger la valeur de votre application face au temps. Résilience et haute performance Mise en cache fine, traitement asynchrone via Symfony Messenger et profiling rigoureux pour garantir une fluidité constante, même sous forte affluence. Culture open source et contribution Acteurs et contributeurs réguliers de l\u0026rsquo;écosystème, nous appliquons les standards de la communauté pour livrer un code propre, testé et documenté. Questions fréquentes sur Symfony # Pourquoi choisir Symfony plutôt qu\u0026#39;un CMS ou un outil no-code ? Les CMS et outils clé en main sont adaptés pour des besoins standards, mais montrent vite leurs limites face à des règles métier complexes, des besoins d\u0026rsquo;intégration poussés ou des volumes de données importants. Symfony offre une liberté totale d\u0026rsquo;architecture, tout en assurant un niveau de robustesse et de sécurité incomparable. Pouvez-vous intervenir sur une base de code Symfony existante avec de la dette technique ? Absolument. Une part importante de nos missions consiste à reprendre en main des projets existants pour les stabiliser. Nous commençons généralement par un audit technique afin de cartographier les risques, puis nous mettons en place un plan de refactorisation progressif, sans interrompre votre activité commerciale. Comment anticiper et réussir une montée de version Symfony ? Une migration réussie repose sur une bonne couverture de tests automatisés et une levée méthodique des dépréciations. Nous auditons vos dépendances tierces, mettons à niveau vos composants palier par palier et validons chaque étape en environnement de recette avant le déploiement en production. Un projet Symfony à concevoir, auditer ou moderniser ? Discutons de vos enjeux applicatifs et définissons la trajectoire technique la plus adaptée à vos objectifs. Échanger avec nos spécialistes ","date":"25 janvier 2025","externalUrl":null,"permalink":"/expertise/experts-symfony/","section":"Expertise","summary":"","title":"Expertise Symfony : un socle robuste pour des applications pérennes","type":"expertise"},{"content":" Le contexte : un site e-commerce en quête de stabilité et de maintenabilité # Tediber, marque emblématique de la literie premium, repose sur une plateforme e-commerce développée avec Sylius 1.10 et Symfony 4.4. Conçue initialement pour offrir une gestion sur mesure du back-office, la solution avait, au fil du temps, été fortement surchargée par des développements spécifiques.\nSi ces personnalisations permettaient de répondre à des besoins métiers précis, elles avaient aussi généré une dette technique importante qui rendait le maintien et l’évolution du site de plus en plus complexe. N’ayant pas été formée sur Sylius, l’équipe technique interne avait des difficultés à s’approprier l’outil, ce qui pouvait freiner l’optimisation et l’ajout de nouvelles fonctionnalités.\nFace à cette situation, Tediber a fait appel à AKAWAKA avec un double objectif : Revenir progressivement vers une implémentation standard de Sylius pour profiter des bonnes pratiques et des mises à jour du framework. Accompagner les équipes internes dans la montée en compétence pour leur permettre de prendre en main la solution en toute autonomie. En parallèle, une refonte technique stratégique a été initiée, incluant une migration de l’ancienne API vers API Platform et une optimisation de la gestion du panier. Un projet ambitieux, mêlant réduction de la dette technique, modernisation et transmission de savoir-faire.\nSite web Tediber Tediber mobilier pour bébé Tediber store mobile Previous Next Nos actions techniques # La mission d’AKAWAKA consistait à moderniser progressivement l’architecture existante sans perturber les opérations e-commerce en cours.\nPour cela, plusieurs actions techniques ont été mises en place :\n1 Migration vers API Platform 2 Refonte du panier 3 Gestion des créneaux de livraison 4 Mise à niveau progressive vers Sylius 1.10 / Symfony 4.4 5 Accompagnement des équipes Sylius API Platform Symfony En Bref # Une plateforme Sylius stabilisée et plus évolutive\nUne réduction significative de la dette technique\nDes équipes internes formées et autonomes\nNotre méthodologie : une refonte progressive et agile # 1 Retour progressif aux standards Sylius L’un des défis majeurs du projet résidait dans la gestion du panier et des commandes, qui avaient été fortement modifiées au fil du temps. L’objectif était de réintégrer les fonctionnalités natives de Sylius, pour garantir une meilleure compatibilité avec les futures mises à jour du framework et une réduction de la dette technique. 2 Migration vers API Platform et standardisation des échanges L’ancienne API de communication entre les services était rigide et peu optimisée. En migrant vers API Platform, nous avons fluidifié les interactions entre les différents éléments. 3 Développement d’un module de gestion des créneaux de livraison Chaque transporteur utilisé par Tediber avait ses propres règles de gestion des créneaux horaires. Cette fonctionnalité spécifique a été intégrée sous la forme d’un module distinct, capable de proposer une personnalisation avancée tout en restant aligné avec l’architecture Sylius. 4 Transmission et accompagnement des équipes L’une des priorités d’AKAWAKA était de rendre les équipes Tediber autonomes sur Sylius. Un programme de formation et d’accompagnement a été mis en place, avec des sessions dédiées aux développeurs et aux product owners, pour leur permettre de mieux s’approprier la plateforme et ses évolutions futures. ` Nos autres réalisations # TooSports : une marketplace éco-responsable qui fait bouger les lignes TooSports est une marketplace dédiée aux équipements de sport de seconde main, facilitant achat, vente et expédition via une interface intuitive Découvrir Tediber : une refonte Sylius pour un e-commerce plus robuste et évolutif Tediber, marque emblématique de la literie premium, s’appuie sur une plateforme e-commerce Sylius 1.10 et Symfony 4.4, initialement conçue pour un back-office sur mesure, mais alourdie par des développements spécifiques Découvrir Refonte du SI Web du CFC : une infrastructure plus moderne pour des enjeux stratégiques Le Centre Français d’exploitation du droit de Copie (CFC) joue un rôle clé dans la gestion des droits d’auteur en France, collectant et redistribuant les redevances pour préserver la valeur des œuvres, grâce à un système d’information performant Découvrir ","date":"3 janvier 2025","externalUrl":null,"permalink":"/realisation/refonte-site-tediber/","section":"Réalisations","summary":"","title":"Tediber : une refonte Sylius pour un e-commerce plus robuste et évolutif","type":"realisation"},{"content":" Vous cherchez une agence de développement web capable de donner vie à vos projets ? Chez AKAWAKA, pas de jargon inutile, pas de promesses en l’air : juste une équipe d’experts engagés, prête à concevoir des solutions digitales sur mesure, robustes et pensées pour optimiser pleinement votre présence en ligne. Notre approche : un site bien construit, c’est avant tout un site qui performe. Bonnes pratiques SEO et UI design appliquées dès le départ, sans exception. Notre approche repose sur trois piliers essentiels # Développement sur mesure Chaque projet numérique est unique : nous l’adaptons à chacun de vos besoins, sans solution toute faite. Expertise technique pointue Symfony, PHP, JavaScript… nous ne suivons pas les tendances, nous les maîtrisons. Collaboration transparente Cahier des charges élaboré avec vous, accompagnement jusqu’à la mise en ligne de votre projet. Des solutions digitales sur mesure, partout en France # Notre équipe est répartie aux quatre coins de l\u0026rsquo;hexagone et travaille à distance avec la même exigence, quel que soit votre lieu d\u0026rsquo;implantation. En nous faisant confiance, vous ne choisissez pas une simple prestation technique : vous optez pour un partenaire stratégique, engagé dans la réussite de vos projets web.\nVitrine Sites vitrine sur mesure Une vitrine digitale efficace pour valoriser votre image de marque et attirer de nouveaux clients. E-commerce Sites e-commerce personnalisés Une boutique optimisée pour maximiser votre taux de conversion. Métier Applications métiers sur mesure Des solutions conçues pour répondre aux défis de votre entreprise et optimiser votre chiffre d’affaires. API Développement d’API Des interfaces robustes et sécurisées pour connecter vos outils et fluidifier votre écosystème digital. Extranet Extranets métier Une plateforme sécurisée pour simplifier la collaboration et la gestion de vos projets. PWA Progressive Web App Une solution hybride pour une accessibilité et des performances optimales. Notre promesse : un site qui performe, un accompagnement qui fait la différence # Pour nous, chaque projet est unique. Notre rôle ne se limite pas à créer des lignes de code : nous construisons des solutions qui s’intègrent parfaitement à votre environnement de travail et à vos usages quotidiens.\nChez AKAWAKA, il n’y a pas de solutions toutes faites et la qualité n’est pas une option : nous analysons, concevons et optimisons votre projet en fonction de vos enjeux réels, avec des développeurs expérimentés capables de créer une relation durable.\nÉvolution et performances : notre engagement pour viser l’excellence # Investir dans la qualité coûte toujours moins cher que de subir les conséquences de la non-qualité. C’est pourquoi notre agence de développement web aborde chaque projet avec une méthodologie pragmatique et un souci du détail constant, où que vous soyez en France.\nApproche centrée utilisateur Des décisions techniques qui servent réellement vos objectifs et améliorent concrètement l’expérience utilisateur. Un projet pensé pour vous Des solutions intégrées à votre quotidien, sans vous imposer de contraintes techniques inutiles. Fiabilité au quotidien Moins de bugs et de failles de sécurité à gérer sur votre application ou votre site. Livrables évolutifs Des produits capables de grandir avec vous et de s’adapter à vos nouveaux enjeux. Des technologies éprouvées, choisies pour durer # Nous construisons vos projets avec des frameworks matures, largement adoptés et soutenus par des communautés actives et dont nous faisons pleinement partie.\nCommencer un projet avec AKAWAKA Notre méthode de développement # Architecture Une base robuste et évolutive Une architecture modulaire et découplée qui limite la dépendance aux évolutions des frameworks, réduit les risques et offre plus de flexibilité. Qualité Tests unitaires et fonctionnels Des tests intégrés dès le début du projet pour détecter les problèmes avant qu’ils n’arrivent, et des mises en production sereines. DevOps Un environnement de développement fluide Des processus industrialisés : un développeur peut prendre en main un projet en moins de 30 minutes et avancer efficacement. Vous voulez en savoir plus sur le développement web ? # C’est quoi une agence de développement web sur mesure ? Une bonne agence web est spécialisée dans la conception, l’optimisation et la création de sites Internet et d’applications web. Elle assure l’architecture technique, la qualité de l’expérience utilisateur, la performance et la sécurité des plateformes en ligne. Comment bien choisir son agence web ? Sélectionnez une agence capable de comprendre vos besoins spécifiques, avec une expertise technique avérée et une approche transparente. Analysez aussi son portfolio, ses méthodes de travail et son engagement envers la qualité et l’évolutivité des projets. Peut-on travailler avec une agence web à distance ? Oui, c’est même la norme aujourd’hui pour la plupart des projets web. Une équipe distribuée, comme la nôtre, permet de collaborer efficacement où que vous soyez en France, à condition de s’appuyer sur des outils de suivi et des points réguliers bien rodés. Nos projets de site web # TooSports TooSports : une marketplace éco-responsable qui fait bouger les lignes\nUne marketplace dédiée aux équipements de sport de seconde main, facilitant achat, vente et expédition via une interface intuitive.\nTediber Tediber : une refonte Sylius pour un e-commerce plus robuste et évolutif\nTediber, marque emblématique de la literie premium, s’appuie sur une plateforme e-commerce Sylius 1.10 et Symfony 4.4, initialement conçue pour un back-office sur mesure.\nCFC Refonte du SI Web du CFC : une infrastructure plus moderne pour des enjeux stratégiques\nLe Centre Français d’exploitation du droit de Copie (CFC) collecte et redistribue les redevances grâce à un système d’information performant.\nUn projet web à concrétiser ? Site vitrine, e-commerce, application métier ou API : parlons de vos objectifs et voyons comment les transformer en solution robuste et évolutive. Échanger avec notre équipe ","date":"23 janvier 2025","externalUrl":null,"permalink":"/service/developpement-web/","section":"Services","summary":"","title":"Développement d’applications web","type":"service"},{"content":" Créer une boutique en ligne performante ne se résume pas à empiler des plugins sur une solution générique. Spécialiste certifiée de l\u0026rsquo;écosystème Sylius, l\u0026rsquo;équipe AKAWAKA développe des plateformes e-commerce B2B et B2C robustes, modulaires et parfaitement alignées avec vos processus métier. Notre constat : Vos processus commerciaux ne devraient jamais être contraints par votre outil e-commerce. Avec Sylius, nous développons exactement les fonctionnalités dont vous avez besoin. Une solution open source pour les projets e-commerce exigeants # Quand un catalogue devient complexe, que les règles tarifaires se multiplient ou que les flux ERP, PIM et CRM s’intensifient, une solution standard peut ne plus répondre pleinement aux besoins de l’entreprise.\nDéveloppé sur le socle Symfony, Sylius réconcilie la flexibilité d’un framework sur mesure avec la maturité d’un moteur e-commerce de référence. Vous gardez la totale maîtrise de votre code, de vos données et de votre feuille de route.\nParler de votre projet Sylius AKAWAKA compte parmi ses rangs des membres de la Sylius Core Contributors Team qui participent directement aux décisions qui façonnent le framework.\nPourquoi faire le choix de l’architecture Sylius ? # Modulaire et sans superflu Activez uniquement les composants nécessaires à votre projet : gestion des stocks personnalisée, règles de taxes spécifiques ou tunnel d\u0026rsquo;achat optimisé pour votre parcours client. L’architecture reste lisible et évolutive à mesure que vos besoins changent. Intégration SI fluide Conçu dès l\u0026rsquo;origine pour s\u0026rsquo;interfacer naturellement avec vos systèmes de gestion : connecteurs ERP, CRM, PIM, plateformes logistiques, marketplaces ou services métier. Les échanges sont conçus pour s’intégrer à vos flux existants et évoluer avec eux. Pérennité du socle Symfony Bénéficiez de la rigueur architecturale, des standards de sécurité et des performances éprouvées du framework PHP de référence. Des configurations adaptées à chaque modèle économique # Nos interventions s\u0026rsquo;adaptent à la complexité réelle de votre activité, de la plateforme B2B internationale à l\u0026rsquo;outil logistique métier.\nCroissance Sylius Core : un lancement agile et évolutif Pour démarrer avec une base légère, ultra-rapide et saine. Vous disposez d\u0026rsquo;un socle prêt à grandir avec votre activité, auquel de nouvelles briques peuvent être ajoutées progressivement, sans devoir envisager une refonte coûteuse. B2B Sylius B2B : pensé pour les flux professionnels complexes Gestion de grilles tarifaires selon les typologies de compte, gestion d’encours, devis personnalisés, validation hiérarchique des commandes et synchronisation bidirectionnelle avec votre ERP. Sur-mesure Parcours utilisateur et règles métier avancées Parcours client personnalisés, abonnements récurrents, configurateurs de produits, catalogues complexes, gestion multi-marques ou multi-boutiques centralisée : la plateforme s’adapte à vos règles métier. Outils internes Sylius Stack : moteur de workflow et back-office métier Au-delà de l’e-commerce, l’écosystème Sylius propose une suite de composants réutilisables pour accélérer le développement de vos applications Symfony : gestion de ressources, opérations CRUD, tableaux de données avec filtres, interfaces d’administration et layouts composables. Nous pouvons les mobiliser pour concevoir des back-offices et outils métier cohérents, maintenables et adaptés à vos usages. Notre approche : l\u0026rsquo;exigence technique au service du ROI # Maîtriser le code ne suffit pas : nous concevons des plateformes pensées pour transformer et durer.\nVision orientée business Chaque choix technique est guidé par vos impératifs de conversion, de rapidité d\u0026rsquo;exécution et de retour sur investissement, sans sur-ingénierie. Transparence et pragmatisme Nous vous conseillons sans détours : nous savons challenger un besoin irréaliste pour privilégier la solution la plus pérenne et économique. Optimisation des performances Temps de réponse minimisés sous forte affluence et fluidité de navigation pour garantir un taux de conversion maximal sur mobile comme sur desktop. Au-delà de l\u0026#39;e-commerce\nSylius Stack : des outils métier Symfony, pensés pour aller vite sans sacrifier la qualité Le panneau d\u0026rsquo;administration de Sylius n\u0026rsquo;a pas été codé à part : il est lui-même bâti sur un socle de composants Symfony génériques, aujourd\u0026rsquo;hui publiés séparément sous le nom de Sylius Stack.\nConcrètement, quand nous construisons un back-office avec cette Stack, il n\u0026rsquo;y a aucune logique de produit, de prix ou de commande en arrière-plan : seulement des écrans d\u0026rsquo;administration clairs, des tableaux de pilotage et des interfaces de gestion, pensés pour s\u0026rsquo;adapter à votre métier, qu\u0026rsquo;il s\u0026rsquo;agisse d\u0026rsquo;un outil RH, d\u0026rsquo;un back-office logistique ou d\u0026rsquo;une interface de monitoring.\nDécouvrir la documentation Sylius Stack Sylius Symfony E-Commerce Tediber : refonte e-commerce et montée de version majeure Marque emblématique de la literie premium en France, Tediber s\u0026rsquo;appuie sur Sylius et Symfony pour piloter l\u0026rsquo;ensemble de son activité commerciale en ligne et son back-office logistique.\nNous intervenons sur l\u0026rsquo;évolution continue de leur plateforme, garantissant stabilité, réactivité et capacité de montée en charge lors des opérations commerciales majeures.\nDécouvrir l\u0026#39;étude de cas Questions fréquentes sur Sylius # Dans quels cas Sylius est-il particulièrement adapté ? Sylius est particulièrement pertinent lorsque votre projet nécessite des fonctionnalités spécifiques, des règles métier avancées ou des connexions avec votre système d’information. C’est notamment le cas pour les catalogues complexes, les parcours d’achat personnalisés, les projets B2B et les intégrations avec un ERP, un CRM ou un PIM. Sylius convient-il à un projet e-commerce B2B ? Oui. Sylius permet de concevoir des parcours B2B adaptés à vos pratiques commerciales : tarification par compte ou par volume, devis, gestion d’encours, validation de commande, accès différenciés et synchronisation avec l’ERP. La plateforme est configurée selon vos règles de fonctionnement, plutôt que l’inverse. Les fonctionnalités B2B sont-elles incluses dans Sylius ? Sylius offre un socle flexible pour construire des parcours B2B spécifiques. Son écosystème propose également des capacités dédiées aux organisations, aux sous-comptes, aux listes de prix, aux devis ou aux commandes rapides. Nous définissons avec vous le périmètre le plus pertinent selon vos processus commerciaux, vos contraintes SI et le niveau de personnalisation attendu. Peut-on faire évoluer une plateforme Sylius au fil du temps ? Oui. L’architecture modulaire de Sylius permet de démarrer avec un périmètre adapté à vos priorités, puis d’ajouter progressivement de nouvelles fonctionnalités, intégrations ou parcours utilisateurs à mesure que votre activité évolue. Pouvez-vous reprendre ou faire évoluer un projet Sylius existant ? Oui. Nous intervenons aussi bien sur la conception d’une nouvelle plateforme que sur l’audit, la reprise et l’évolution de projets existants. Nous commençons par comprendre l’architecture en place, les enjeux métier et les priorités afin de définir un plan d’action pragmatique. Un projet e-commerce d\u0026#39;envergure à construire avec Sylius ? Audit, création de plateforme ou reprise de projet existant : étudions ensemble l\u0026rsquo;architecture la plus adaptée à vos ambitions de croissance. Échanger avec nos experts Sylius ","date":"20 janvier 2025","externalUrl":null,"permalink":"/expertise/experts-sylius/","section":"Expertise","summary":"","title":"Expertise Sylius : l’e-commerce sur mesure conçu pour durer","type":"expertise"},{"content":" Le contexte : créer un marché du sport plus vert et plus accessible # Too Sports, c’est une marketplace dédiée aux équipements de seconde main dans le domaine du sport. En mettant en relation vendeurs et acheteurs, la plateforme facilite l’achat, la vente et l’expédition de matériel sportif d’occasion, le tout via une interface fluide et intuitive.\nAvec une ambition claire (rendre la vente et l’achat d’équipements sportifs aussi simples que possible), Too Sports a fait appel à AKAWAKA pour construire une solution technique robuste, évolutive et performante. Le défi ? Concevoir une plateforme accessible et simple à utiliser, tout en assurant une architecture technique modulable, capable d’évoluer en fonction des besoins des utilisateurs.\nLes trois priorités du projet :\n1 Simplifier l\u0026rsquo;UX Simplifier l’expérience utilisateur avec un parcours fluide pour ajouter, gérer et vendre un produit. 2 Optimiser les interactions Optimiser les interactions entre utilisateurs avec un système de chat intégré et une gestion avancée des profils. 3 Faciliter les envois Faciliter les envois pour permettre aux vendeurs d’expédier leurs articles simplement et rapidement. Site web TooSports Site web TooSports format tablette Site web TooSports Previous Next Nos solutions techniques # Pour garantir des performances optimales et une plateforme modulable, nous avons construit Too Sports sur une architecture API-first, associant Sylius, Symfony et API Platform pour le back-end, et NextJS pour le front-end. Ce choix technologique permet d’assurer une plateforme performante, évolutive et facile à maintenir sur le long terme.\nSylius Symfony API Platform NextJS En Bref # Un parcours utilisateur simplifié pour maximiser l’engagement\nUne architecture évolutive capable de grandir avec la marketplace\nUne solution performante pensée pour un usage fluide et intuitif\nNotre méthodologie : un projet agile et adaptatif # Une équipe modulable pour une gestion flexible du projet # Le développement de Too Sports s’est fait dans un contexte évolutif. L’équipe technique est passée de 5 personnes au démarrage à seulement 2 développeurs sur certaines phases. Cela a eu un impact sur la gestion des priorités, nous incitant à concentrer nos efforts sur les fonctionnalités clés tout en maintenant un haut niveau de qualité.\nUne approche centrée utilisateur # Pour garantir une prise en main intuitive, nous avons mené un travail approfondi sur l’UX et l’ergonomie. L’objectif était de réduire au maximum la friction dans le parcours utilisateur, notamment sur l’ajout et la mise en vente de produits, afin que chaque utilisateur puisse vendre ou acheter en quelques clics.\nUne optimisation des interactions et des flux logistiques # L’un des points stratégiques de la marketplace était de faciliter la communication entre acheteurs et vendeurs. Nous avons donc mis en place un système de chat intégré et une gestion avancée des profils, permettant des échanges fluides et efficaces. Côté expédition, le défi était d’adapter le processus de mise en vente aux contraintes logistiques tout en garantissant une expérience fluide pour les utilisateurs.\nNos autres réalisations # TooSports : une marketplace éco-responsable qui fait bouger les lignes TooSports est une marketplace dédiée aux équipements de sport de seconde main, facilitant achat, vente et expédition via une interface intuitive Découvrir Tediber : une refonte Sylius pour un e-commerce plus robuste et évolutif Tediber, marque emblématique de la literie premium, s’appuie sur une plateforme e-commerce Sylius 1.10 et Symfony 4.4, initialement conçue pour un back-office sur mesure, mais alourdie par des développements spécifiques Découvrir Refonte du SI Web du CFC : une infrastructure plus moderne pour des enjeux stratégiques Le Centre Français d’exploitation du droit de Copie (CFC) joue un rôle clé dans la gestion des droits d’auteur en France, collectant et redistribuant les redevances pour préserver la valeur des œuvres, grâce à un système d’information performant Découvrir ","date":"12 janvier 2025","externalUrl":null,"permalink":"/realisation/too-sport-marketplace/","section":"Réalisations","summary":"","title":"TooSports : une marketplace éco-responsable qui fait bouger les lignes","type":"realisation"},{"content":" Un audit technique sans langue de bois : on identifie vos points faibles, on sécurise, on optimise et on vous donne un plan d\u0026rsquo;action clair. Notre philosophie : Pas de jargon inutile, pas de rapport à rallonge. On vous donne l\u0026rsquo;essentiel (et rien que l\u0026rsquo;essentiel) pour avancer sereinement. Le développement d’un CRM ou d’une application métier performante repose sur trois piliers essentiels : une architecture solide, une qualité irréprochable et une parfaite harmonie entre le frontend et le backend. S’il y a un grain de sable quelque part dans les rouages, c’est tout votre projet qui risque d’en pâtir.\nC’est là que nous intervenons. Nous passons votre application au crible pour identifier ses failles techniques, optimiser ses performances et garantir la pérennité de votre solution.\nFaire appel à nos services Un état des lieux précis et un plan d’action efficace # L’audit est un élément important pour identifier les forces et les faiblesses de votre solution. Nous analysons en profondeur votre infrastructure, détectons les points critiques et vous accompagnons dans la mise en place des solutions adaptées.\nAudit d\u0026rsquo;architecture Analyse de chaque choix technique, du frontend au backend, pour identifier les points faibles qui freinent les performances de votre infrastructure. Audit de performance Traque de chaque ralentissement, identification des goulots d\u0026rsquo;étranglement et amélioration de la réactivité de votre solution. Audit de sécurité Détection des vulnérabilités pour protéger vos données et celles de vos utilisateurs, sur vos intranets et extranets. Nos expertises techniques pour propulser vos projets # Avec leurs 15 ans d’expérience, les experts d’AKAWAKA ne se contentent pas d’auditer : ils construisent et optimisent votre infrastructure avec vous.\nStack Choix technologiques adaptés Sélection des technologies les plus pertinentes (Symfony, PHP, JavaScript…) selon vos contraintes réelles. Équilibre Performance, coût, maintenabilité Anticipation des évolutions et recherche du meilleur équilibre entre ces trois dimensions. Montée en compétences Formations techniques Accompagnement de vos équipes pour qu\u0026rsquo;elles montent en compétences sur vos technologies clés. Modernisation Montées de version \u0026amp; refactoring Gestion des montées de version et refactoring progressif pour moderniser vos applications sans perturber votre activité. 15+\nAns d\u0026rsquo;expérience\nUne pratique terrain de l\u0026rsquo;audit et du conseil technique. 0\nJargon inutile\nDes recommandations claires et actionnables. Symfony \u0026amp; PHP\nExpertise open source\nUne culture technique éprouvée sur ces écosystèmes. Choisissez l’audit et le conseil qui apporte des solutions (pas de nouveaux problèmes) # Chez AKAWAKA, chaque audit est un véritable levier d’amélioration. Nous analysons avec précision, identifions les problèmes concrets et proposons des solutions actionnables. Notre approche repose sur une culture de l’excellence, une vision globale et une expertise open source éprouvée sur Symfony, PHP et bien d’autres technologies.\nNous ne faisons pas que pointer les failles. Nous construisons une stratégie pour renforcer vos outils et garantir leur performance à long terme. Notre engagement ? Vous fournir des recommandations claires et efficaces, tout en établissant une relation de confiance, basée sur la transparence et les résultats.\nPrêt·e à passer votre projet au crible ? Vous avez un doute sur votre architecture, vos performances ou votre sécurité ? Prenons 30 minutes pour évaluer votre besoin ensemble. Pas de rapport à rallonge, des réponses concrètes. Échanger avec un·e expert·e ","date":"23 janvier 2025","externalUrl":null,"permalink":"/service/audit-et-conseils-dexpert/","section":"Services","summary":"","title":"Audit et conseils d’expert","type":"service"},{"content":" Une expertise CMS moderne, headless et sur-mesure pour vos projets web d’envergure. Notre philosophie : Pas de thème tout fait, pas de bricolage. Uniquement du code propre, testé, évolutif et taillé pour durer. Vous cherchez un CMS puissant et extensible pour vos plateformes complexes, mais vous peinez à trouver des partenaires techniques à la hauteur ?\nChez AKAWAKA, nous combinons notre expertise Symfony historique et notre maîtrise du CMS Sulu pour concevoir des plateformes robustes, performantes et alignées avec vos processus métier.\nDiscuter de votre projet Sulu Vos projets méritent mieux que la lourdeur d’un CMS standard # Sulu est un CMS headless open-source conçu nativement sur les composants Symfony. Il associe la rigueur d\u0026rsquo;un framework d\u0026rsquo;entreprise à une expérience de gestion de contenu fluide et ergonomique.\nArchitecture Symfony native Intégration avec vos services, vos bundles, vos tests automatisés et vos pratiques de développement. Headless \u0026amp; API-first Une architecture découplée pour alimenter vos frontends et vos différents canaux. Multi-site \u0026amp; multilingue Gérez plusieurs marques, pays ou marchés depuis votre plateforme. Expérience éditeur Un back-office personnalisable pour faciliter le travail de vos équipes éditoriales. En clair : Sulu est le CMS que vous auriez développé vous-même si vous en aviez le temps.\nPourquoi choisir AKAWAKA pour votre accompagnement Sulu ? # Votre projet doit répondre à des impératifs d’évolutivité, de sécurité et de performance. Les expert·es Sulu d’AKAWAKA ne réalisent pas d’intégration générique au kilomètre : nous concevons des architectures pérennes et intégrées à votre écosystème.\nArchitecture Sites corporate \u0026amp; usines à sites Conception modulaire pensée pour les plateformes institutionnelles et les écosystèmes multi-marques. Intégration SI Connexion à vos outils tiers Liaison fluide avec votre ERP, PIM, CRM ou DAM via des API robustes et sécurisées. Sur-mesure Bundles Symfony dédiés Développement de types de contenus avancés et de fonctionnalités métier sans bricolage. Front-end Architectures modernes \u0026amp; Headless Découplage API-first et intégration aux frameworks front modernes (Next.js, Nuxt, Vue). Pérennité Support \u0026amp; montées de version Audit préventif, maintenance corrective et anticipation des versions majeures Symfony/Sulu. Notre engagement : du code propre, des résultats mesurables # Chaque plateforme livrée par AKAWAKA respecte les meilleures pratiques de développement Symfony. Nos applications conservent une grande fluidité de navigation et un temps de réponse minimal, même sous fortes montées en charge.\nL\u0026rsquo;accompagnement s\u0026rsquo;inscrit sur la durée : nous anticipons les montées de versions majeures de Symfony et de Sulu afin de préserver votre investissement technique d\u0026rsquo;année en année.\nPrêt·e à cadrer votre projet ? Sulu n\u0026rsquo;est pas adapté à tous les contextes. Si vous cherchez un socle solide, structurant et pérenne, prenons 30 minutes pour évaluer votre besoin ensemble. Pas de slides, que du concret. Prendre contact avec un·e expert·e ","date":"4 janvier 2025","externalUrl":null,"permalink":"/expertise/experts-sulu/","section":"Expertise","summary":"","title":"Expertise CMS Sulu sur-mesure","type":"expertise"},{"content":" Le contexte : un système vieillissant qui doit faire face à de nouveaux défis # Le Centre Français d’exploitation du droit de Copie (CFC) est un acteur essentiel de la gestion des droits d’auteur en France. En assurant la collecte et la redistribution des redevances en lien avec la copie d’œuvres protégées, il permet aux auteurs et aux éditeurs de préserver la valeur de leurs créations. La mission de refonte du SI Web du CFC repose sur un système d’information performant, capable de gérer un volume important de données et de transactions complexes. Des enjeux clés pour un futur durable.\nPour autant, face à l’évolution des pratiques numériques et à une réglementation toujours plus exigeante, l’infrastructure existante commençait à montrer certains signes de faiblesse. Son architecture était devenue obsolète et ne répondait plus aux exigences de scalabilité, de sécurité et d’optimisation des processus internes. Avec l’arrivée d’un nouveau directeur de l’innovation, une modernisation complète s’est alors imposée. L’objectif était double :\nIndustrialiser l’infrastructure pour lui garantir une meilleure résilience et capacité d’évolution. Optimiser la gestion des flux internes pour accroître l’efficacité des équipes et améliorer l’expérience utilisateur. Site web CFC format tablette Site web CFC Site web CFC Previous Next Nos solutions techniques pour répondre aux enjeux clés # Côté applications métiers, AKAWAKA a conçu une architecture technique robuste et pérenne autour des technologies Symfony, API Platform et Sylius Stack, capable de garantir à la fois stabilité, sécurité et flexibilité.\nL’ensemble repose sur une architecture hexagonale, pour garantir une bonne modularité et évolutivité. Ce choix permet également d’intégrer de nouvelles fonctionnalités sans pour autant impacter le cœur du système et offre ainsi un meilleur niveau d’adaptabilité aux futures évolutions à prévoir.\nCôté site institutionnel, nos équipes ont choisi le CMS Sulu pour sa capacité à allier souplesse d’édition et rigueur technique.\nConstruit nativement sur Symfony, Sulu a permis de bénéficier de toute la puissance de ce framework tout en offrant une interface de gestion de contenu moderne et intuitive.\nCe choix nous a permis de proposer une solution CMS 100 % intégrable avec une structure headless.\nSymfony API Platform Sulu CMS Sylius RabbitMQ ElasticSearch En Bref # Un SI Web plus robuste et automatisé\nUne infrastructure prête pour l’avenir\nDes applications métiers enfin interopérables\nNotre méthodologie et processus de mise en œuvre # La refonte du SI Web du CFC a été menée en plusieurs étapes clés par nos experts, pour assurer une transition maîtrisée et sans interruption des services essentiels. Grâce à cette refonte, le CFC dispose désormais d’un système d’information moderne, robuste et évolutif, capable de répondre à tous les enjeux de demain.\n1 Conception d’une architecture scalable et résiliente Nos experts ont mis en place une infrastructure modulaire, capable d’évoluer au fil du temps sans remettre en question la globalité du système. Grâce à l’architecture hexagonale, les différents services sont maintenant indépendants les uns des autres et garantissent une bonne flexibilité et interopérabilité. 2 Automatisation et optimisation des processus L’un des défis majeurs de cette refonte était de réduire le risque d’erreurs humaines et d’optimiser les traitements. Nous avons donc implémenté un système de gestion centralisée des tâches asynchrones avec RabbitMQ (pour fluidifier les traitements lourds), afin d’anticiper d’éventuelles anomalies et d’améliorer la réactivité des équipes techniques. 3 Montée en charge et validation des performances Avant la mise en production, des tests de charge et de robustesse ont été réalisés pour garantir un système capable de gérer une montée en charge progressive, sans impacter les performances. Nos autres réalisations # TooSports : une marketplace éco-responsable qui fait bouger les lignes TooSports est une marketplace dédiée aux équipements de sport de seconde main, facilitant achat, vente et expédition via une interface intuitive Découvrir Tediber : une refonte Sylius pour un e-commerce plus robuste et évolutif Tediber, marque emblématique de la literie premium, s’appuie sur une plateforme e-commerce Sylius 1.10 et Symfony 4.4, initialement conçue pour un back-office sur mesure, mais alourdie par des développements spécifiques Découvrir Refonte du SI Web du CFC : une infrastructure plus moderne pour des enjeux stratégiques Le Centre Français d’exploitation du droit de Copie (CFC) joue un rôle clé dans la gestion des droits d’auteur en France, collectant et redistribuant les redevances pour préserver la valeur des œuvres, grâce à un système d’information performant Découvrir ","date":"28 janvier 2025","externalUrl":null,"permalink":"/realisation/refonte-si-web-cfc/","section":"Réalisations","summary":"","title":"Refonte du SI Web du CFC : une infrastructure plus moderne pour des enjeux stratégiques","type":"realisation"},{"content":" Un accompagnement technique fiable et sur mesure pour garantir la continuité, la performance et l’évolution de vos applications web. Notre philosophie : Pas de solutions standardisées ni d’intervention ponctuelle sans lendemain. De la précision, de la fiabilité et une expertise adaptée à la réalité de vos projets. Vos projets web ne peuvent pas se permettre d’attendre. Les délais s’enchaînent, les enjeux évoluent et, dans tout ça, la performance ne doit jamais faiblir.\nNotre centre de service est un partenaire stratégique conçu pour assurer soutien, expertise et continuité dans la gestion quotidienne de vos applications et plateformes digitales.\nFaire appel à nos services Un accompagnement sans faille pour tous vos projets web # Chaque projet web implique des défis uniques. Nous proposons des solutions fiables, évolutives et adaptées à votre réalité métier : pas de superflu, juste une prise en charge efficace pour garantir la performance et la pérennité de vos outils numériques.\nReprise de projets en difficulté Audit, diagnostic et stabilisation de vos sites e-commerce, CRM, ERP métier ou développements laissés en plan. Maintenance applicative Correction des anomalies, suivi de la stabilité et amélioration continue de vos applications grâce à la TMA et à la TME. Développement sur mesure Conception d’intranets, d’extranets et d’applications métier performantes, adaptés à vos besoins. Un centre de service pour stabiliser, faire évoluer et moderniser # Reprise Vos projets sont en difficulté ? Nous reprenons les rênes. Un outil qui s’effondre, une application qui ne répond plus ou un développement interrompu : nous analysons les causes, stabilisons l’existant et construisons un plan de reprise efficace. Pas de patch temporaire, mais des actions qui redonnent à votre outil numérique tout son potentiel. TMA / TME Gardez une longueur d’avance sur les imprévus La fiabilité d’une application ne se limite pas à son lancement. Nous corrigeons les anomalies techniques, améliorons l’existant et enrichissons votre solution au fil de vos nouveaux besoins métier. Sur-mesure De la conception à la mise en ligne Une idée d’intranet ou d’extranet ? Nous la transformons en application web performante grâce à des technologies open source éprouvées, une approche agile et une collaboration étroite avec vos équipes. Évolution Des mises à jour fluides et sécurisées Nous assurons les mises à jour de vos frameworks et applications, tout en anticipant les dépendances obsolètes et les freins techniques afin de préserver la stabilité de votre système. Qualité Un code plus propre, sans interrompre vos opérations Le refactoring progressif permet de restructurer et moderniser une application existante sans imposer de réécriture complète ni perturber l’activité. 15+\nAns d\u0026rsquo;expérience\nUne expertise terrain pour accompagner vos projets dans la durée. TMA / TME\nMaintenance applicative\nDes applications stabilisées, corrigées et enrichies en continu. Open source\nNotre ADN\nDes technologies robustes, transparentes et pérennes. Choisissez un centre de service pensé pour durer # Faire appel à AKAWAKA, c’est choisir bien plus qu’une simple prestation technique : c’est s’appuyer sur un partenaire capable de vous accompagner dans la durée, avec une approche pragmatique et efficace.\nNotre expertise repose sur plus de 15 ans d’expérience et une maîtrise des technologies open source les plus robustes. Notre équipe reste à l’écoute de vos besoins pour anticiper vos demandes et assurer une prise en charge réactive de vos problématiques.\nBesoin de renforcer ou de stabiliser vos applications ? Qu’il s’agisse d’un projet à reprendre, d’une application à faire évoluer ou d’un besoin de maintenance dans la durée, échangeons sur votre contexte et vos priorités. Échanger avec notre équipe ","date":"23 janvier 2025","externalUrl":null,"permalink":"/service/centre-de-services/","section":"Services","summary":"","title":"Un centre de service adapté à vos besoins","type":"service"},{"content":" Sécurisez vos livraisons critiques, alignez équipes tech et métiers, et pilotez vos projets avec une gouvernance claire et proactive. Notre philosophie : Pas de pilotage à vue, pas de méthodologie rigide plaquée au forceps. Uniquement du cadrage pragmatique, du leadership transparent et des projets menés à bon port. Un projet digital ne se résume pas à une belle idée et quelques lignes de code. Sans une direction claire et une gouvernance adaptée, même les meilleures intentions finissent par dériver ou s\u0026rsquo;enliser.\nChez AKAWAKA, nous mettons à votre disposition notre expérience terrain du pilotage technique et opérationnel pour structurer vos équipes, fluidifier les échanges et sécuriser vos jalons sans alourdir l\u0026rsquo;organisation.\nDiscuter de votre projet Les signaux d’alerte qui indiquent qu’il faut reprendre la main # Retards récurrents Les dates de livraison glissent de sprint en sprint sans explication claire ni visibilité sur l\u0026rsquo;atterrissage réel. Dialogue rompu Les équipes métier ont l\u0026rsquo;impression que la tech n\u0026rsquo;avance pas, tandis que les développeurs se sentent incompris. Dette \u0026amp; surcharge Le « run » et les urgences quotidiennes vampirisent l\u0026rsquo;énergie nécessaire aux chantiers stratégiques. Une feuille de route claire, agile et sans détours inutiles # Chaque organisation possède ses propres contraintes. Notre rôle n\u0026rsquo;est pas d\u0026rsquo;empiler des réunions ou des outils superficiels, mais de créer une dynamique d\u0026rsquo;exécution efficace, fluide et prédictible.\nFeuille de route réaliste Jalons tangibles, arbitrages pragmatiques et suivi transparent pour éviter les dérives budgétaires et temporelles. Alignement Tech \u0026amp; Métier Traduction continue des enjeux business en priorités techniques pour que tout le monde avance dans la même direction. Anticipation des risques Identification précoce des goulots d’étranglement pour désamorcer les blocages avant qu\u0026rsquo;ils n\u0026rsquo;impactent la trajectoire. Processus scalables Structuration et simplification des méthodes de travail pour accompagner sereinement la montée en charge. En clair : Un bon pilotage ne surveille pas seulement un planning en cochant des cases, il donne le rythme et lève les obstacles.\nPourquoi faire appel à AKAWAKA pour piloter vos opérations ? # Plateforme e-commerce à fort trafic, intranet sensible, ERP métier ou refonte d\u0026rsquo;envergure : chaque écosystème impose des défis spécifiques. Nos directeurs de projets et experts opérationnels interviennent au cœur de votre organisation pour garantir la sérénité des livraisons.\nGouvernance Direction de projet agile \u0026amp; pragmatique Mise en place de rituels adaptés à votre contexte réel, clarification des rôles et arbitrages réguliers sans rigidité administrative. Opérations Optimisation des flux de travail Audit des frictions internes, fluidification des chaînes de décision et alignement des équipes de développement avec les sponsors. Systèmes complexes Pilotage d\u0026#39;ERP, CRM \u0026amp; Extranets métier Gestion de projets à forte criticité métier nécessitant une maîtrise fine des interdépendances et des contraintes techniques. Sécurité des livraisons Gestion des dépendances \u0026amp; des prestataires Coordination transverse entre régies externes, éditeurs tiers, équipes internes et directions métier. Expérience Plus de 15 ans de pratique terrain Un leadership ancré dans la réalité du code et de l\u0026rsquo;architecture, assurant un dialogue crédible et fluide avec vos développeurs. Nos formats d\u0026rsquo;intervention # Diagnostic \u0026amp; Déblocage Mission commando (1 à 2 semaines) : audit express des goulots d\u0026rsquo;étranglement et recommandations d\u0026rsquo;arbitrage immédiates. Direction de projet déléguée Pilotage opérationnel récurrent : gouvernance, animation des rituels, coordination transverse jusqu\u0026rsquo;à la mise en production. Coaching \u0026amp; Structuration Accompagnement de vos chefs de projet et Tech Leads pour des processus agiles légers et durables. 15+\nAns d\u0026rsquo;expérience\nUne pratique terrain du pilotage technique et opérationnel. 100%\nPragmatisme\nUne approche sur-mesure, sans méthode copiée-collée. Tech \u0026amp; SI\nDouble culture\nUne compréhension fine du code et de l\u0026rsquo;architecture. Questions fréquentes 🔎 # Intervenez-vous en remplacement ou en appui de nos équipes ? Nous privilégions la co-construction. Nous nous intégrons aux côtés des équipes en place pour les accompagner, clarifier les rôles et fluidifier les processus, sans créer de dépendance à notre intervention. Avez-vous une méthodologie imposée (Scrum, Kanban, etc.) ? Nous ne partons pas d’un cadre unique. Nous choisissons les rituels et les indicateurs adaptés à la taille de l’équipe et aux contraintes de livraison, puis les faisons évoluer selon les besoins du projet. Comment s\u0026#39;articule votre double compétence technique et gestion de projet ? C\u0026rsquo;est la force d\u0026rsquo;AKAWAKA : notre expérience des enjeux de développement, d’architecture et de dette technique facilite les échanges avec les équipes techniques. Elle permet aussi d’évaluer les estimations et les arbitrages en tenant compte de leurs contraintes. Notre engagement : un leadership en toute transparence # Avec plus de 15 ans d’accompagnement d’équipes tech et produit, nous ne nous contentons pas de relancer les intervenants. Nous structurons, anticipons et optimisons chaque étape du cycle de vie de votre application.\nNotre approche repose sur l\u0026rsquo;adaptabilité et la recherche permanente d\u0026rsquo;efficacité opérationnelle, transformant la direction de projet en un véritable levier de rentabilité et de sérénité pour votre entreprise.\nBesoin de sécuriser vos livraisons ou restructurer vos opérations ? Vous faites face à un projet qui dérape, une équipe sous tension ou un lancement critique à venir ? Prenons 30 minutes pour analyser votre situation et définir un plan d\u0026rsquo;action immédiat. Échanger avec un·e expert·e ","date":"23 janvier 2025","externalUrl":null,"permalink":"/service/direction-des-operations-direction-de-projet/","section":"Services","summary":"","title":"Direction des opérations \u0026 direction de projet","type":"service"},{"content":"La protection de vos données personnelles est au cœur de nos engagements. La présente politique a pour objet de vous expliquer en toute transparence la manière dont la société AKAWAKA collecte, utilise et protège vos informations lorsque vous naviguez sur le site akawaka.fr ou que vous nous contactez.\nNotre site a été conçu selon le principe de minimisation des données : il s\u0026rsquo;agit d\u0026rsquo;un site statique ne proposant aucun compte utilisateur, ne déposant aucun cookie ou traceur publicitaire, et ne conservant aucune donnée de navigation superflue.\nLa présente politique est établie en conformité avec le Règlement Général sur la Protection des Données (RGPD, Règlement UE 2016/679) et la loi n° 78-17 du 6 janvier 1978 modifiée (« Informatique et Libertés »).\n1. Responsable du traitement # Le responsable du traitement des données est :\nAKAWAKA SAS\nSociété par actions simplifiée au capital de 4 000 euros\nImmatriculée au RCS de Paris sous le numéro SIRET : 893 587 717 00032\nCode APE : 6201Z\nSiège social : 173 RUE DE COURCELLES 75017 PARIS, France\nPour toute question relative à cette politique ou pour exercer vos droits :\nPar courriel : bonjour@akawaka.fr Par courrier postal : AKAWAKA — Gestion des données personnelles, 173 rue de Courcelles 75017 Paris, France. 2. Données traitées et modalités de collecte # Dans le cadre de l\u0026rsquo;exploitation de ce site statique, les seules données personnelles susceptibles d\u0026rsquo;être traitées sont :\nA. Demandes de contact (formulaire ou courriel direct) # Lorsque vous nous transmettez un message via notre formulaire de contact ou directement par e-mail :\nDonnées traitées : nom, prénom, adresse e-mail, numéro de téléphone (si renseigné), objet et contenu de votre message, ainsi que toute information fournie spontanément. Fonctionnement technique : les informations saisies dans le formulaire ne sont enregistrées dans aucune base de données web. Elles sont directement converties en un message électronique acheminé vers notre service de messagerie d\u0026rsquo;entreprise (SMTP) afin d\u0026rsquo;être prises en charge par l\u0026rsquo;équipe AKAWAKA. B. Journaux techniques et sécurité (logs serveur) # Lors de votre consultation du site, le serveur génère des journaux techniques standards :\nDonnées traitées : adresse IP publique, date et heure de la requête, URL demandée, code réponse HTTP et chaîne d\u0026rsquo;agent utilisateur (navigateur / système d\u0026rsquo;exploitation). Finalité : assurer la distribution des fichiers, la disponibilité du service, la prévention des attaques et la maintenance technique. 3. Finalités et bases légales # Nous ne traitons vos données que pour des finalités précises et légitimes :\nFinalité du traitement Données concernées Base légale (RGPD) Répondre à vos demandes d\u0026rsquo;information, d\u0026rsquo;audit ou de prestation Données d\u0026rsquo;identité, coordonnées et contenu du message Intérêt légitime (art. 6.1.f) à échanger avec nos interlocuteurs professionnels, ou mesures précontractuelles (art. 6.1.b) prises à votre demande Assurer le bon fonctionnement, la performance et la sécurité du site Journaux techniques de connexion (logs, IP) Intérêt légitime (art. 6.1.f) à garantir la sécurité et la continuité du service Traitement des demandes d\u0026rsquo;exercice de droits Données d\u0026rsquo;identité et historique de la demande Obligation légale (art. 6.1.c) découlant du RGPD et de la loi Informatique et Libertés Le site ne procède à aucun profilage, à aucune prise de décision automatisée, ni à aucun démarchage commercial automatisé.\n4. Durées de conservation # Vos données sont conservées uniquement pendant la durée strictement nécessaire aux finalités pour lesquelles elles ont été collectées :\nDemandes de contact et prospection : en l\u0026rsquo;absence de conclusion d\u0026rsquo;un contrat ou d\u0026rsquo;une collaboration, les correspondances et coordonnées sont conservées pendant un délai maximal de 3 ans à compter du dernier contact émanant de votre part. Dossiers clients et partenaires : en cas de contractualisation, les informations nécessaires à la gestion du contrat sont conservées pendant toute la durée de la relation, puis archivées conformément aux obligations légales et délais de prescription applicables (notamment 5 ans pour la responsabilité contractuelle et 10 ans pour les pièces comptables). Journaux techniques (logs serveur) : conservés pour une durée n\u0026rsquo;excédant pas 1 an avant purge ou écrasement automatique. 5. Destinataires et sous-traitants # Vos données personnelles sont traitées exclusivement par les collaborateurs d\u0026rsquo;AKAWAKA habilités à répondre à vos demandes. Elles ne font l\u0026rsquo;objet d\u0026rsquo;aucune cession, location ou revente à des tiers.\nCertains prestataires techniques interviennent pour l\u0026rsquo;infrastructure du site :\nHébergement du site statique : OVHcloud Acheminement et messagerie (SMTP) : Microsoft 365 Nous veillons à ce que nos prestataires présentent des garanties contractuelles et techniques conformes aux exigences du RGPD.\n6. Transferts hors Union européenne # Nous privilégions l’hébergement et le traitement de vos données au sein de l’Union européenne.\nEn cas de recours à un prestataire situé en dehors de l\u0026rsquo;Espace économique européen (par exemple pour l\u0026rsquo;infrastructure cloud ou la messagerie), nous nous assurons que le transfert est encadré par une décision d\u0026rsquo;adéquation de la Commission européenne (notamment le cadre de protection des données UE-États-Unis / Data Privacy Framework) ou, à défaut, par la signature des Clauses contractuelles types de la Commission européenne complétées de mesures de sécurité adaptées.\n7. Cookies et traceurs # Le site akawaka.fr ne dépose aucun cookie traceur, aucun outil d\u0026rsquo;analyse statistique avec suivi individuel, ni aucun composant publicitaire ou de réseau social.\nPuisqu\u0026rsquo;il s\u0026rsquo;agit d\u0026rsquo;un site statique sans espace de connexion ni suivi marketing, aucun cookie soumis à consentement n\u0026rsquo;est utilisé. Aucun bandeau de consentement n\u0026rsquo;est donc nécessaire lors de votre navigation.\n8. Vos droits # Conformément à la réglementation applicable, vous bénéficiez des droits suivants :\nDroit d’accès : obtenir la confirmation que des données vous concernant sont traitées et en obtenir une copie. Droit de rectification : obtenir la mise à jour ou la correction de données inexactes ou incomplètes. Droit à l’effacement (« droit à l’oubli ») : demander la suppression de vos données personnelles, sous réserve de nos obligations légales d\u0026rsquo;archivage. Droit à la limitation du traitement : demander le gel temporaire du traitement de vos données dans les cas prévus par la loi. Droit d’opposition : vous opposer à tout moment, pour des raisons tenant à votre situation particulière, aux traitements fondés sur notre intérêt légitime. Directives post-mortem : définir des directives relatives à la conservation, à l\u0026rsquo;effacement et à la communication de vos données après votre décès. Pour exercer ces droits, il vous suffit de nous écrire à l\u0026rsquo;adresse suivante : bonjour@akawaka.fr (ou par courrier au siège social).\nSi vous estimez, après nous avoir contactés, que vos droits ne sont pas respectés, vous avez la possibilité d\u0026rsquo;introduire une réclamation auprès de la CNIL (Commission nationale de l\u0026rsquo;informatique et des libertés).\n9. Sécurité # AKAWAKA met en œuvre les mesures techniques et organisationnelles appropriées pour garantir un niveau de sécurité adapté : recours exclusif au protocole sécurisé HTTPS (chiffrement TLS), contrôle strict des accès administrateurs et exploitation d\u0026rsquo;une architecture statique nativement protégée contre la majorité des failles logicielles applicatives.\n10. Modifications # Cette politique de confidentialité peut être ajustée pour refléter l\u0026rsquo;évolution des fonctionnalités du site ou de nos prestataires techniques. La date figurant dans l\u0026rsquo;en-tête de cette page indique la date de dernière mise à jour.\n","date":"14 janvier 2026","externalUrl":null,"permalink":"/politique-de-confidentialite/","section":"Votre e-commerce doit évoluer. \u003cbr/\u003e Sa technologie aussi.","summary":"","title":"Politique de confidentialité","type":"page"},{"content":" Le bon moment pour se poser la question\nVotre plateforme s’adapte-t-elle encore à votre métier ? Une boutique peut bien fonctionner pendant des années, puis devenir difficile à faire évoluer. Le nombre de modules ne suffit pas à décider d’une migration : ce sont les objectifs, les blocages et le coût des compromis qui comptent.\nChaque nouveau besoin exige un contournement ou un développement spécifique. Stocks, prix ou livraisons varient selon les zones, les clients ou les canaux. Les connexions à l’ERP, au PIM ou aux outils logistiques freinent les évolutions. Le parcours client souhaité se heurte aux limites de la plateforme actuelle. La question à trancher\nFaire évoluer l’existant, moderniser progressivement ou refondre ?Nous examinons avec vous les besoins métier, les équipes, le budget, le calendrier et les enjeux de performance et de référencement avant de recommander une trajectoire.Échanger sur mon site → Quand Sylius devient pertinent Lorsque le commerce a besoin de règles métier spécifiques, d’intégrations poussées ou de parcours d’achat sur mesure, sa base Symfony et son architecture extensible ouvrent des possibilités de conception adaptées au projet. Quand il vaut mieux questionner ce choix Pour une boutique standard, une solution plus simple peut suffire. Sylius demande une équipe compétente pour le développer et le faire évoluer ; nous intégrons cette réalité dans la recommandation. Là où nous intervenons\nOn aime les projets qui demandent de réfléchir avant de développer. Vous avez déjà une plateforme, des équipes et des contraintes bien réelles. Notre travail est de trouver une trajectoire qui leur corresponde, puis de construire une solution que vous pourrez continuer à faire vivre.\nReprendre un Sylius existant Personnalisations difficiles à maintenir, évolutions ralenties, mise à niveau délicate : on examine l’existant et on avance par étapes.\nCe que nous avons fait avec Tediber → Repenser une boutique devenue trop contrainte Catalogue, règles de prix, parcours d’achat ou connexions au SI : on vérifie d’abord si Sylius apporte la souplesse dont votre activité a besoin.\nNotre expertise Sylius → Construire au-delà de la boutique Marketplace et échanges entre applications : notre expertise Symfony, Sylius et API Platform sert aussi les modèles qui sortent du cadre habituel.\nLe projet TooSports → Moderniser un système d’information métier Applications métier, back-offices et site institutionnel : avec Symfony, la Sylius Stack et le CMS Sulu, on bâtit une architecture modulaire qui évolue sans tout remettre en cause.\nLa refonte du SI web du CFC → Référence · Tediber\nFaire évoluer Sylius sans repartir de zéro. Chez Tediber, les développements spécifiques avaient rendu la plateforme plus complexe à maintenir. AKAWAKA a accompagné un retour progressif aux standards Sylius, modernisé les échanges avec API Platform et aidé les équipes à gagner en autonomie.\nModernisation progressive de l’architecture Travail sur le panier et les flux de livraison Transmission de compétences aux équipes internes Lire l’étude de cas → Référence · CFC\nUn système d’information modernisé pièce par pièce. Applications métier sur Symfony, API Platform et la Sylius Stack, site institutionnel sur le CMS Sulu : une architecture hexagonale qui permet au CFC de faire évoluer son SI sans fragiliser l’existant.\nDécouvrir la refonte du CFC → Travailler ensemble\nOn vous dit ce qu’on ferait. Et pourquoi. Il peut être plus juste de faire évoluer votre site que de tout recommencer. Nous prenons le temps de le vérifier avec vous.\nOn regarde l’existant Le code, les parcours, les données, les outils connectés et les sujets qui ralentissent vos équipes.\nOn pose les choix sur la table Continuer sur la plateforme actuelle, moderniser progressivement ou préparer une refonte : chaque option a ses conséquences.\nOn construit avec vos équipes Notre objectif est aussi que les personnes qui feront vivre la solution puissent se l’approprier.\nAu-delà du e-commerce\nVotre projet web a d’autres défis ? Notre expertise Symfony, PHP et Sulu sert aussi des applications métier, des outils internes et des plateformes web sur mesure. Selon votre organisation, nous intervenons en maintenance et évolution applicative (TMA), en renfort de vos équipes (régie) ou dans la conduite d’un projet dédié.\nTous nos services → Développement d’applications web Chaque projet est unique. Notre équipe vous accompagne à toutes les étapes, de la conception à la mise en production. Découvrir le service → Centre de services Un accompagnement personnalisé, à l’écoute de votre produit, de vos utilisateurs et de vos objectifs. Découvrir le service → Audit et conseils d’expert Un diagnostic précis et honnête pour identifier les priorités et poser des bases techniques solides. Découvrir le service → Direction des opérations et de projet Une organisation rigoureuse et des décisions alignées avec vos contraintes et vos priorités. Découvrir le service → À propos\nNotre histoire Une équipe d’expert·es née pour faire plus qu’écrire du code.\nAKAWAKA a été créée en janvier 2021 avec une conviction : un bon accompagnement technique tient autant aux choix d’architecture qu’à la manière de les partager. Nous privilégions les solutions durables, une communication transparente et la transmission de compétences aux équipes que nous accompagnons.\nEn savoir plus sur AKAWAKA → 2021 Création d’AKAWAKA Symfony Notre socle depuis le premier jour Sylius Partenaire officiel depuis 2022 Votre prochaine étape\nVotre site vous freine ? Parlons du vrai problème. Présentez-nous votre plateforme, vos contraintes et ce que vous souhaitez changer. Nous examinerons ensemble les pistes possibles.\nParler à l’équipe AKAWAKA → ou écrivez-nous à contact@akawaka.fr Pour bien démarrer l’échange\nVotre plateforme actuelle et son historique Les contraintes qui pèsent sur vos équipes Ce que vous aimeriez pouvoir changer ","date":"14 janvier 2026","externalUrl":null,"permalink":"/","section":"Votre e-commerce doit évoluer. \u003cbr/\u003e Sa technologie aussi.","summary":"","title":"Votre e-commerce doit évoluer. \u003cbr/\u003e Sa technologie aussi.","type":"page"},{"content":"","date":"25 janvier 2025","externalUrl":null,"permalink":"/posts/","section":"Actualités","summary":"","title":"Actualités","type":"posts"},{"content":"","date":"25 janvier 2025","externalUrl":null,"permalink":"/categories/api-platform/","section":"Categories","summary":"","title":"API Platform","type":"categories"},{"content":"","date":"25 janvier 2025","externalUrl":null,"permalink":"/tags/api-platform/","section":"Tags","summary":"","title":"API Platform","type":"tags"},{"content":"","date":"25 janvier 2025","externalUrl":null,"permalink":"/authors/","section":"Authors","summary":"","title":"Authors","type":"authors"},{"content":"","date":"25 janvier 2025","externalUrl":null,"permalink":"/categories/","section":"Categories","summary":"","title":"Categories","type":"categories"},{"content":"","date":"25 janvier 2025","externalUrl":null,"permalink":"/categories/conf%C3%A9rences/","section":"Categories","summary":"","title":"Conférences","type":"categories"},{"content":"","date":"25 janvier 2025","externalUrl":null,"permalink":"/authors/gaetan/","section":"Authors","summary":"","title":"Gaetan","type":"authors"},{"content":" L’édition 2025 de l’API Platform Conference a une saveur particulière : API Platform fête ses 10 ans. Pour l’occasion, la communauté s’est réunie à Lille autour de deux journées intenses de conférences, de retours d’expérience et d’annonces qui vont marquer l’avenir du framework. Chez AKAWAKA, nous étions présents pour capter les évolutions clés, prendre la mesure des tendances à venir et surtout partager avec vous ce qui fera la différence demain dans vos projets. Kévin Dunglas — 10 ans d’API Platform : un écosystème en pleine maturité # Keynote Mercure FrankenPHP Dans sa keynote d’ouverture, Kévin Dunglas est revenu sur le chemin parcouru : d’un simple bundle Symfony, API Platform est devenu un framework complet qui a donné naissance à des briques majeures comme Mercure et FrankenPHP. Aujourd’hui, l’outil supporte officiellement Symfony comme Laravel et continue de s’ouvrir à de nouveaux usages — jusqu’à intégrer gRPC grâce à FrankenPHP.\nL’hommage rendu à Ryan Weaver, voix emblématique de SymfonyCasts et contributeur clé disparu cet été, a aussi rappelé combien l’humain et la transmission sont au cœur de cet écosystème.\nAntoine Bluchet — API Platform 4.2 : la révolution continue # API Platform 4.2 Query Parameters Antoine Bluchet, release manager d’API Platform, a dévoilé les nouveautés de la version 4.2 :\n1 Query parameters Les filtres via #[ApiFilter] vivent leurs derniers instants. Place à une approche plus souple et puissante avec des paramètres de requête typés et documentés. 2 Metadata mutators De nouveaux attributs permettent d’ajuster dynamiquement les ressources et opérations. 3 JSON Streamer Sérialisation en flux continu, idéale pour les gros volumes de données. 4 Performance boost FrankenPHP en mode worker, deux fois plus rapide que PHP-FPM. 5 Interopérabilité renforcée Support OpenAPI amélioré et compatibilité accrue avec Laravel. Prochaine étape Déjà en ligne de mire : API Platform 5.0 en 2026, qui actera définitivement ces évolutions.\nSupport de présentation # Retrouvez les slides d\u0026rsquo;Antoine ici :\nMatthias Arlaud — Optimiser la sérialisation avec JsonStreamer # JsonStreamer Symfony Performance Avec humour et une belle métaphore autour de la gestion d’une librairie, Matthias Arlaud met en avant les limites du serializer Symfony classique : lorsqu’on doit renvoyer des milliers d’objets en JSON, tout est chargé en mémoire avant d’être renvoyé au client. Résultat : ralentissements, voire erreurs out of memory.\nLa solution ? JsonStreamer, intégré à API Platform 4.2 :\nau lieu de sérialiser tout d’un coup, il “stream” le JSON objet par objet ; la mémoire reste stable, peu importe le volume de données ; le time-to-first-byte est bien plus rapide, améliorant la perception de performance côté utilisateur. En pratique, une simple configuration jsonstream: true sur une ressource permet d’activer ce mode. JsonStreamer est donc idéal pour les API qui doivent exposer de gros flux de données (catalogues produits, logs, statistiques…).\nEn chiffres Les résultats sont là : plus de 30% de gain de performance et une utilisation mémoire plafonnée ; plus le nombre de résultats à récupérer est élevé, plus les gains augmentent.\nSupport de présentation # Retrouvez les slides de Matthias ici :\nClément Talleu — Redis, un moteur de persistance pour API Platform # Redis php-redis-om Clément Talleu nous a replongés dans l’histoire : stagiaire en 2015 chez Les-Tilleuls.coop, il faisait partie des premiers utilisateurs d’API Platform. Dix ans plus tard, il y contribue directement, notamment avec un object mapper Redis pour PHP.\nRedis, base NoSQL clé/valeur ultra-rapide, peut désormais devenir un moteur de persistance natif pour API Platform grâce à php-redis-om. L’intérêt ?\nExploiter Redisearch pour des recherches textuelles à la vitesse de l’éclair (@name:{toto}) Bénéficier d’une syntaxe proche de Doctrine (find(), findByLike()…) Utiliser #[ApiResource] et #[RedisOM/Entity] pour brancher directement une entité Redis dans API Platform. Clément a aussi montré comment gérer filtres, pagination et providers personnalisés pour brancher Redis comme n’importe quelle autre source de données. Un pas de plus vers l’idée d’API Platform agnostique du moteur de persistance.\nClément Herreman — Normaliser les erreurs pour des APIs plus humaines # RFC 7807 DX “Invalid data” ou “Server error” : qui n’a jamais pesté face à des messages d’erreur vagues ?\nClément Herreman a plaidé pour l’adoption de la RFC 7807 (Problem Details for HTTP APIs). Cette norme définit un format JSON clair et universel :\ntype : code unique de l’erreur (machine-readable), title : titre compréhensible par un humain, detail : description du cas concret, instance : identifiant unique de l’erreur. Avec API Platform, même les erreurs deviennent des ressources : on peut définir une ErrorResource, les documenter dans OpenAPI et même les enrichir de contexte.\nClément recommande aussi de laisser les titres d’erreurs en anglais (codes uniques) et de déléguer la traduction côté front.\nRésultat : des APIs plus explicites pour les développeurs front, moins de tickets de support et des utilisateurs mieux armés face aux problèmes.\nMehdi Zaidi — Multi-tenant avec PostgreSQL # PostgreSQL Multi-tenant SaaS De plus en plus d’applications SaaS doivent gérer plusieurs clients (tenants) sur une même base, tout en garantissant l’isolation des données.\nMehdi Zaidi a présenté une architecture multi-tenant PostgreSQL avec Symfony et API Platform :\nun schéma par client (tenant), généré à la volée lors de l’onboarding ; des vues matérialisées et un owner_id pour tracer l’appartenance des données ; un DatabaseManager custom capable de créer bases, tables et utilisateurs SQL spécifiques pour la sécurité. Il a aussi abordé la question des migrations : appliquées sur la base principale, elles évitent de multiplier les opérations sur chaque schéma client. Résultat : une approche scalable et pragmatique pour gérer des dizaines (voire centaines) de tenants.\nNils Adermann — Composer : sécurité et bonnes pratiques # Composer Sécurité Créateur de Composer, Nils Adermann a livré un message clair : la chaîne d’approvisionnement PHP est une cible privilégiée. Attaques par typosquatting, packages malveillants, comptes compromis…\nParmi ses conseils :\nUtiliser composer audit et roave/security-advisories pour identifier les vulnérabilités. Ne jamais supprimer un tag publié (les machines l’ont peut-être déjà téléchargé). S’appuyer sur composer update --minimal-changes ou --patch-only pour limiter les risques lors des mises à jour. Toujours committer le composer.lock (et ne jamais déployer sans). À découvrir Il a aussi présenté Conductor, un outil de Private Packagist conçu spécifiquement pour fiabiliser les mises à jour Composer, là où Dependabot ou Renovate peuvent parfois créer du bruit.\nTobias Petry — Bases de données à grande échelle # Scalabilité Sharding Le terme legacy est souvent mal défini. Cela peut faire référence à du vieux code, à du code sans tests, ou même du code qui génère des bugs difficiles à corriger. Mais la vraie question posée par Tobias Petry était plutôt : comment scaler une base SQL sans sombrer dans la complexité ?\nTobias Petry a partagé ses retours :\nCommencer simple : scale up (plus grosse machine) avant de complexifier. La réplication en lecture améliore la scalabilité mais introduit des problèmes de consistance. Le sharding (partition horizontale) est puissant mais dangereux en self-hosted : difficile à maintenir en cas de panne. Il cite des solutions comme Vitess (YouTube) ou Citus (PostgreSQL), mais recommande de rester pragmatique : le sharding est le “graal”, mais à utiliser uniquement pour des cas critiques de volumétrie.\nXavier Leune — 180 000 requêtes par seconde avec PHP # Performance HTTP/2 HTTP/3 Xavier Leune a mené une démo impressionnante : atteindre 180k requêtes HTTP/s depuis PHP.\nSa recette :\nexploiter curl_multi pour exécuter des requêtes en parallèle réduire le “busy looping” en utilisant curl_multi_select tirer parti de HTTP/2 (multiplexing) et HTTP/3/QUIC (UDP + chiffrement natif), plus efficaces que HTTP/1.1 En poussant plus loin, il a exploré le multithreading (via pcntl_fork ou pecl/parallel) et l’usage de mémoire partagée (shmop). Une plongée bas niveau qui prouve que PHP, bien optimisé, peut rivaliser avec des outils spécialisés en charge réseau.\nYoan Bernabeu — De Apache à FrankenPHP # FrankenPHP Infra Yoan Bernabeu a raconté sa migration d’une infra traditionnelle Apache + Nginx + Symfony vers FrankenPHP.\nObjectif : simplifier et réduire les coûts. Résultat :\nplus besoin de load balancer Apache/Nginx HTTPS géré nativement une architecture allégée, plus transparente et plus économique Un témoignage concret qui confirme que FrankenPHP n’est pas qu’un concept expérimental, mais une vraie alternative en production.\nAPI Platform Conference 2025 – Le mot de la fin # L’API Platform Conference 2025 a une nouvelle fois tenu toutes ses promesses avec ces conférences de qualité. Comme toujours, l’organisation était irréprochable, permettant aux participants de profiter pleinement de chaque moment. Sans oublier l’excellent apéro, qui a permis de poursuivre les discussions dans une ambiance chaleureuse et détendue.\nUne édition à la hauteur des attentes, vivement la prochaine !\nÀ très vite ! 👋\n","date":"25 janvier 2025","externalUrl":null,"permalink":"/api-platform-con-2025/","section":"Actualités","summary":"","title":"L’API Platform Conference 2025 à Lille","type":"posts"},{"content":"","date":"25 janvier 2025","externalUrl":null,"permalink":"/tags/php/","section":"Tags","summary":"","title":"PHP","type":"tags"},{"content":"","date":"25 janvier 2025","externalUrl":null,"permalink":"/tags/symfony/","section":"Tags","summary":"","title":"Symfony","type":"tags"},{"content":"","date":"25 janvier 2025","externalUrl":null,"permalink":"/tags/","section":"Tags","summary":"","title":"Tags","type":"tags"},{"content":"","date":"4 janvier 2025","externalUrl":null,"permalink":"/expertise/","section":"Expertise","summary":"","title":"Expertise","type":"expertise"},{"content":"","date":"20 janvier 2025","externalUrl":null,"permalink":"/tags/e-commerce/","section":"Tags","summary":"","title":"E-Commerce","type":"tags"},{"content":"","date":"20 janvier 2025","externalUrl":null,"permalink":"/categories/sylius/","section":"Categories","summary":"","title":"Sylius","type":"categories"},{"content":"","date":"20 janvier 2025","externalUrl":null,"permalink":"/tags/sylius/","section":"Tags","summary":"","title":"Sylius","type":"tags"},{"content":" Le 19 juin, nous avons participé à la Sylius Party organisée à Toulouse par Emagma. Une journée dense, riche en retours d’expérience, annonces techniques et rencontres autour de l’écosystème Sylius. L’événement s’adressait autant aux développeurs confirmés qu’aux curieux souhaitant approfondir leurs connaissances sur Sylius, ses plugins, ses performances ou encore ses usages détournés hors e-commerce. Antoine Bluchet — Sylius 2.0 \u0026amp; API Platform # API Platform FrankenPHP Sylius 2.0 Antoine Bluchet nous livre un retour d’expérience d’intégration d’API Platform dans Sylius, avec un regard extérieur mais éclairé : il est mainteneur d’API Platform et release manager, bien qu’il ne soit pas un spécialiste de Sylius.\nPoints clés abordés # Intégration de JSON-LD dans l’API Sylius : bien que non activée par défaut, l’activation est triviale grâce à API Platform. Toutefois, les résultats ne sont pas conformes à 100 % au standard Schema.org — Antoine montre comment corriger facilement ces écarts. Utilisation des Resource Mutators, une nouveauté d’API Platform 3.4, pour ajuster dynamiquement les ressources. Performance avec FrankenPHP : un serveur web embarquant PHP, qui, en mode worker, réduit considérablement le temps d’exécution en réutilisant un environnement PHP pré-initialisé. Découverte du composant JsonStreamer de Symfony 7.3 : ce composant permet une sérialisation JSON plus performante, utile notamment pour les réponses volumineuses. Encore en phase d’intégration dans API Platform et Sylius. Joachim Løvgaard — Creating Sylius Plugins # Architecture Plugins Qualité de code Joachim Løvgaard partage de précieuses bonnes pratiques pour créer des plugins Sylius robustes et maintenables.\nRecommandations principales # Respecter semver. Réduire la complexité d’installation. Fournir des valeurs par défaut cohérentes. Créer ses propres entités plutôt que de surcharger celles de Sylius. Utiliser des DTO/VO pour limiter les ruptures de compatibilité. Préférer les providers aux repositories pour éviter les conflits. Faciliter le hook via DataMappers. Intégrer des tests fonctionnels et d’intégration. Faire du mutation testing. Utiliser PHPStan au niveau le plus strict et enrichir les PHPDoc. Intégrer une CI (GitHub Actions ou autre). Utiliser le squelette officiel de plugin Sylius. Et surtout : adopter les outils d’IA comme JetBrains AI Assistant (Junie), et développer en open source pour attirer des contributeurs. Piotr Szymanski — The Sylius 2.0 Plugin Upgrade Journey # Migration Sylius 2.0 Symfony 7.3 Piotr Szymanski nous présente les coulisses de la migration d’un plugin vers Sylius 2.0.\nIl commence par nous faire une rétrospective sur l’évolution de Sylius, avec sa version 1 dans les années 2023 jusqu’à la sortie officielle de la version 2.0 fin 2024. Il en profite également pour présenter la nouvelle équipe derrière Sylius : une équipe plus conséquente, structurée autour de pôles différents (front-end, back-end, QA, UX design, etc.). Le projet Sylius a bien grandi. Bien entendu, il fait aussi un focus sur les Key Contributors — coucou à Loïc, Estelle, Valentin et Florian.\nNouveautés apportées par Sylius 2.0 # Passage à API Platform v4. Introduction des Twig Hooks. Remplacement de Winzou par Symfony Workflow. Migration de Semantic UI à Bootstrap. Suppression de jQuery. Refactoring massif des templates Twig. Étapes de migration # 1 Dépendances Mise à jour des dépendances. 2 Base de données \u0026amp; templates Migration de la base de données et des templates. 3 JS/CSS Refonte JS/CSS avec Webpack Encore. 4 Tests Réécriture de tests (abandon de PhpSpec au profit de PHPUnit et Behat). 5 Paiement Intégration de la nouvelle API de paiement (basée sur Payment Request, plus sur Payum). 6 Tests de plugin Utilisation de TestApplication, une mini-app Sylius pour tester les plugins plus efficacement. Bonus : nouveautés Sylius 2.1 annoncées Symfony 7.3, PHP 8.4, Node.js 24. Refonte visuelle de l’admin. Accessibilité (WCAG). Migration des tests vers Unit testing natif Symfony. Retrouvez notre article sur le sujet Migration vers Sylius 2.1 : un enjeu technique et stratégique majeur.\nGrégoire Pineau — Asynchrone avec Messenger et Mercure # Symfony Messenger Mercure Temps Réel Grégoire Pineau vulgarise l’asynchronisme avec Symfony Messenger et montre comment Mercure permet de notifier un utilisateur en temps réel.\nCas d’usage : upload de CSV # En synchrone, le serveur est bloqué pendant le traitement. En asynchrone, un message est placé dans une queue, traité par un worker. Messenger facilite cette mise en œuvre (commande make:message, configuration des transports, messenger:consume…). Retours d’expérience # Ne jamais envoyer un fichier dans un message. Utiliser un pointeur (path). Pour le feedback utilisateur : Mercure, basé sur SSE (Server-Sent Events), plus simple et sécurisé que WebSockets. Publication d’événements côté back, réception native dans le navigateur. Pour la UI : il recommande Symfony UX/Turbo pour actualiser dynamiquement les composants. Estelle Gaits — Pole Position on the Grid # Sylius Resource Bundle Sylius Grid Bundle Sylius Stack Live Components Estelle Gaits propose une superbe métaphore entre Sylius Stack et la F1, pour illustrer la puissance du couple Resource Bundle + Grid Bundle.\nObjectif : créer un admin rapidement # Resource Bundle gère les modèles, routes, opérations. Grid Bundle offre les vues (tableaux, filtres, formulaires). En combinant les deux avec quelques attributs PHP (AsGrid, AsFilter, etc.), on génère une interface admin complète quasi automatiquement. Nouveautés à venir # Intégration des Live Components dans les Grids pour une UX dynamique (filtrage, pagination, sans rechargement complet). Mention spéciale à Loïc Frémont qui œuvre activement à cette intégration. Sylius Party 2025 — Le mot de la fin # Une fois de plus, Emagma a organisé un événement de grande qualité, réunissant des acteurs clés de l’écosystème Sylius, qu’ils soient utilisateurs, contributeurs ou curieux de la stack. La journée a parfaitement mêlé conférences techniques pointues, retours d’expérience concrets et découvertes de nouveautés à venir dans Sylius 2.x.\nEt comme toujours, l’apéro a été un moment convivial, propice aux échanges informels entre développeurs, agences, core team et contributeurs. L’occasion idéale de poser ses questions, partager des idées, ou simplement trinquer autour d’un bon verre entre passionnés du framework.\nOn a hâte de remettre ça pour la prochaine édition !\nUn projet Sylius à lancer, migrer ou étendre ? Migration vers Sylius 2.x, développement de plugins, back-offices avec Sylius Stack : nos experts Sylius vous accompagnent de bout en bout. Découvrir notre expertise Sylius ","date":"20 janvier 2025","externalUrl":null,"permalink":"/sylius-party-2025/","section":"Actualités","summary":"","title":"Sylius Party 2025 – Toulouse","type":"posts"},{"content":"","date":"20 janvier 2025","externalUrl":null,"permalink":"/categories/sylius-stack/","section":"Categories","summary":"","title":"Sylius Stack","type":"categories"},{"content":" L’heure de la migration vers Sylius 2.1 a sonné ! Sorti le 4 juin 2025, il s’agit d’une mise à jour structurante pour les e-commerces sur Symfony. Cette version n’est pas qu’une simple mise à jour : c’est un véritable réentoilage stratégique de votre boutique. PHP 8.4 Symfony 7.3 Doctrine ORM 3 API Platform 4.1 Node.js 24 WCAG AA PHPUnit Elle intègre notamment PHP 8.4, Symfony 7.3, Doctrine ORM 3, API Platform 4.1, Node.js 24, WCAG AA, un tableau de bord admin modernisé et le passage de PHPSpec à PHPUnit.\nPourquoi migrer ? Les risques d’une version 1.x en fin de vie # Fin de support de Sylius 1.14 à horizon 2026 # Fin de maintenance Sylius 1.14 (ou antérieur) ne bénéficiera plus de maintenance au-delà de 2026. Cela signifie :\nPlus de correctifs de sécurité Plugins incompatibles avec les composants récents Régression technique progressive, avec surcharge de maintenance À l’inverse, Sylius 2.1 s’appuie sur un socle à jour :\nSymfony 7.3 PHP 8.4 Doctrine ORM 3 API Platform 4.1 Conséquences concrètes # Sylius 2.1 intègre des optimisations profondes du code, une meilleure modularité, et des tests automatisés plus robustes grâce au passage de PHPSpec à PHPUnit.\nRésultat Un code plus propre, plus rapide à exécuter, et plus simple à maintenir.\nUn CMS natif enfin intégré # Attendue de longue date, cette fonctionnalité permet désormais de créer des pages éditoriales (FAQ, blog, landing), de gérer les médias, et d’intégrer des blocs dynamiques sans effort de développement. C’est un gain de temps énorme pour les équipes marketing.\nAccessibilité et conformité légale # Sylius 2.1 est conforme WCAG AA par défaut. Une réponse directe aux exigences du European Accessibility Act qui s’applique à partir de 2025 à toutes les boutiques en ligne en Europe.\nÉcosystème de plugins modernisé # La majorité des plugins Sylius sont désormais développés pour la version 2. Rester sur 1.14, c’est :\nmultiplier les coûts de maintenance ; perdre l’accès aux nouvelles fonctionnalités ; risquer l’obsolescence de vos modules. Quelles sont les nouveautés clés de Sylius 2.x ? # Refonte complète du front-office et de l’admin : Bootstrap + Symfony UX remplacent Semantic UI et jQuery Templates Twig modernisés : meilleure lisibilité, modularité, personnalisation facilitée via les Twig Hooks Compatibilité API Platform 4 : pour construire des API headless performantes Tests unitaires standardisés avec PHPUnit Dashboard admin enrichi : KPIs, alertes en un coup d’œil Les enjeux techniques et fonctionnels de la migration vers Sylius 2.1 # Migrer vers Sylius 2, ce n’est pas juste faire une mise à jour. C’est :\nRéécrire le thème personnalisé si vous avez fortement adapté le front ou l’admin Auditer vos plugins pour vérifier leur compatibilité Repenser certaines logiques JS si vous avez utilisé jQuery ou du code maison Adapter les surcharges Twig aux nouveaux mécanismes Un audit d’abord Un audit est donc indispensable avant de se lancer.\nComment anticiper une migration réussie ? # 1 Audit technique complet Thème, plugins, dépendances, surcharges. 2 Feuille de route projet Chiffrage, planning, phases de tests. 3 Environnement de préproduction Pour valider sans risque. 4 Montée en version progressive Code, tests, données. 5 Validation métier Accessibilité, UI, workflows e-commerce. Un accompagnement expert est indispensable pour éviter les erreurs coûteuses.\nL’accompagnement AKAWAKA # Chez AKAWAKA, les experts Sylius connaissent le framework dans les moindres recoins. Forts de 4 key contributors et certifiés Sylius, nos équipes accompagnent des clients depuis la version 1.0 jusqu’à 2.1, avec des projets sur-mesure complexes et évolutifs.\nNotre approche :\n📈 Montée en performance assurée 🔍 Audit clair, sans zones d’ombre ⚙️ Migration progressive et maîtrisée 🧪 Tests automatisés et vérification UX Conclusion : ne subissez pas la migration, anticipez-la # Sylius 2.1 apporte tout ce qu’on attend d’une plateforme e-commerce moderne : rapidité, conformité, évolutivité. La migration peut sembler ambitieuse, mais bien préparée, elle est une opportunité stratégique.\nConfiez-la à une équipe qui maîtrise le sujet. Chez AKAWAKA, pas de blabla : on vous guide, on exécute, et on délivre.\nVotre boutique tourne encore sous Sylius 1.x ? Audit de migration, feuille de route, montée de version progressive : nos experts Sylius, dont 4 key contributors, vous accompagnent jusqu’à Sylius 2.1. Découvrir notre expertise Sylius ","date":"13 janvier 2025","externalUrl":null,"permalink":"/migration-vers-sylius-2-1-un-enjeu-technique-et-strategique-majeur/","section":"Actualités","summary":"","title":"Migration vers Sylius 2.1 : un enjeu technique et stratégique majeur","type":"posts"},{"content":"","date":"28 janvier 2025","externalUrl":null,"permalink":"/tags/afup/","section":"Tags","summary":"","title":"AFUP","type":"tags"},{"content":" Le 16 mai dernier, une partie de l’équipe AKAWAKA était présente à l’AFUP Day à Lyon 2025. Comme chaque année, l’événement a rassemblé la communauté PHP autour de conférences techniques de haut niveau, d’échanges inspirants et d’une atmosphère toujours aussi conviviale. Dans cet article, on vous partage un condensé de quelques talks marquants de la journée. Les speakers de l’AFUP Day Lyon 2025 Nicolas Jourdan — L’ETL, ce qu’il vous manquait pour intégrer vos clients # ETL Symfony Intégration de données Nicolas Jourdan nous a plongés dans une problématique bien concrète : comment intégrer les données de clients ayant des API similaires, mais pas totalement compatibles. Sa réponse : une architecture ETL maison, basée sur Symfony.\nE Extract Création de services Fetcher pour interroger l’API externe. T Transform Un service DataMapper pour normaliser les données. L Load Un Loader qui pousse les données dans l’API de l’entreprise. Le tout orchestré par un service central, Orchestrator, avec gestion des erreurs, logs détaillés et mécanismes de DataResolver pour traiter les cas limites.\nBonnes pratiques Nicolas insiste sur la rigueur nécessaire : poser les bonnes questions (volumétrie, performances, connecteurs existants…), documenter, tester en entrée/sortie, loguer chaque étape, et concevoir une solution flexible et évolutive.\nVincent Amstoutz — Débusquez les failles cachées avec Infection \u0026amp; Pest # Tests de mutation Infection Pest Tester son code, c’est bien. Tester ses tests, c’est mieux. Vincent Amstoutz nous introduit aux tests de mutation pour valider réellement la robustesse de nos suites de tests automatisés.\nIl illustre le principe des mutants : des modifications volontaires du code qui ne doivent pas passer inaperçues. Si un mutant ne provoque aucun échec de test, il met en lumière une faiblesse.\nOutils phares : Infection et Pest, qui permettent de configurer facilement ces tests de mutation.\nAvec pragmatisme Mais Vincent tempère : on ne commence pas par ça. Il faut d’abord avoir une bonne base de tests classiques. Ensuite, on peut introduire les mutations progressivement, avec pragmatisme.\nPablo Godinez — Comprendre et appliquer le Pattern Repository en PHP # DDD Doctrine Repository Pablo Godinez décortique chaque aspect du modèle Repository tel que présenté dans DDD et par Martin Fowler :\nCollection en mémoire, Critères de filtrage, Mécanismes cachés de persistance via l’ORM. Il propose une approche pour rendre les Repository Doctrine plus lisibles, en les rendant filtrables via des méthodes enchaînables sur le QueryBuilder.\nIl approfondit le fonctionnement de l’Unit of Work, inspiré de l’event sourcing pour optimiser les opérations SQL. Et conclut sur quelques règles d’or :\nLes règles d’or # Ne pas faire transiter toutes les lectures par l’ORM – le SQL reste parfois la meilleure option. Un mauvais modèle entraîne un mauvais repository. Pas un repository par entité systématiquement. Limiter les relations trop complexes. Robin Chalas — Gestion des failles de sécurité dans l’écosystème PHP # Sécurité Symfony CVE Avec pédagogie, Robin Chalas nous rappelle une vérité essentielle : plus une base de code est vaste, plus elle est exposée aux vulnérabilités. Symfony ne fait pas exception avec ses 1,5 million de lignes de code et ses 29 000 téléchargements quotidiens.\nRobin nous détaille le processus rigoureux de déclaration et de correction d’une faille :\n1 Signalement privé À security@symfony.com. 2 Analyse Par la security team. 3 Patch privé Puis relecture. 4 Notification Des projets impactés (comme Drupal). 5 Publication D’un Security Advisory (CVE). 6 Release publique Ses conseils Ses conseils : publier un security.txt, utiliser composer audit, dépendre d’outils comme Dependabot, et surtout soutenir les mainteneurs de l’écosystème.\nThomas Di Luccio — Votre app à l’épreuve du Black Friday # Scalabilité Performance Blackfire Thomas Di Luccio nous emmène dans une histoire vraie de lancement raté pour illustrer les bonnes pratiques de scalabilité applicative. Son mantra : faire tomber l’app avant qu’elle ne tombe toute seule.\n1 Tester sous charge Utiliser Gatling, Locust, Artillery pour simuler un trafic réaliste, identifier les points de rupture. 2 Environnements ISO production Ne jamais tester en prod. Des outils comme Platform.sh permettent de cloner fidèlement les environnements. 3 Observabilité dès le dev Grâce à Blackfire, Thomas montre comment profiler, monitorer, et visualiser les goulets d’étranglement dans le code PHP. 4 Bien penser la mise à l’échelle Se demander quelle ressource est sollicitée, pourquoi, et pour quel résultat. Ne pas surdimensionner à l’aveugle. AFUP Day Lyon 2025 — Le mot de la fin # Encore une fois, l’AFUP Day a tenu toutes ses promesses : du concret, de l’inspiration, et une communauté toujours aussi engagée. Même si un incident technique a retardé le démarrage d’une heure, l’organisation a su faire preuve de réactivité exemplaire pour rattraper le retard. Bravo à toute l’équipe !\nOn se retrouve pour le Forum PHP 2025 les 9 et 10 octobre à Paris pour l’édition anniversaire : 25 ans de l’AFUP et 30 ans de PHP !\nUne application Symfony à sécuriser ou à faire passer à l’échelle ? Tests, sécurité des dépendances, performance sous charge : nos experts Symfony auditent et font évoluer vos applications PHP. Découvrir notre expertise Symfony ","date":"28 janvier 2025","externalUrl":null,"permalink":"/afup-day-lyon-2025/","section":"Actualités","summary":"","title":"Retour sur l’AFUP Day Lyon 2025 : nos temps forts","type":"posts"},{"content":"","date":"28 janvier 2025","externalUrl":null,"permalink":"/categories/symfony/","section":"Categories","summary":"","title":"Symfony","type":"categories"},{"content":" C’est quoi AKAWAKA? # AKAWAKA est une SAS au capital de 4 000 euros, inscrite au RCS de Paris sous le numéro SIRET 893 587 717 00032, et ayant pour code APE 62.01Z (Programmation informatique).\nLe siège social est situé à l’adresse :\n173 RUE DE COURCELLES\n75017 PARIS\nFrance\nContenus, vie privée et droit d’auteur # Le responsable de la publication est M. LENOBLE Fabrice, Directeur de la société, joignable par mail : bonjour@akawaka.fr.\nCe site ne recueille aucune informations personnelle.\nLes textes et contenus mis à disposition sur ce site sont soumis à la loi Française sur le droit d’auteur.\n","date":"27 janvier 2025","externalUrl":null,"permalink":"/mentions-legales/","section":"Votre e-commerce doit évoluer. \u003cbr/\u003e Sa technologie aussi.","summary":"","title":"Mentions légales","type":"page"},{"content":" Sylius grids offer a powerful, flexible, and customizable way to present your entities in an HTML table for your back or front office. For those interested in creating a custom Sylius grid, they provide numerous options. FieldType services are responsible for rendering each cell in the table, and the Sylius grid bundle currently provides three main types:\nStringFieldType: used to render a simple string. DatetimeFieldType: displays a Datetime object, allowing configuration of format and timezone. TwigFieldType: renders the field using a Twig template, enabling great customization. A new type is coming to Sylius to give you even more flexibility. We will cover it at the end of this article. This includes possibilities for creating custom Sylius grids.\nWhile these field types cover many needs, you may want to create custom field types for specific scenarios.\nImplementing FieldTypeInterface # First, let’s examine the FieldTypeInterface. This interface is straightforward and has two methods:\nrender(Field $field, $data, array $options); – Responsible for returning the HTML content of a cell. configureOptions(OptionsResolver $resolver): void; – Allows the field type to be configured with options. For example:\n1 Create the field type Create a field type BadgeFieldType.php for displaying labels. 2 Register it Configure the field type, specify the service for $dataExtractor and add the sylius.grid_field tag to register the type. 3 Add a builder Create a builder BadgeField.php to make the field easier to configure. 4 Use it in a grid Configure the field in a grid in PostGrid.php. src/FieldType/BadgeFieldType.php config/services.yaml src/FieldType/Builder/BadgeField.php src/Grid/PostGrid.php src/FieldType/BadgeFieldType.php\u0026lt;?php declare(strict_types=1); namespace App\\FieldType; use Sylius\\Component\\Grid\\DataExtractor\\DataExtractorInterface; use Sylius\\Component\\Grid\\Definition\\Field; use Sylius\\Component\\Grid\\FieldTypes\\FieldTypeInterface; use Symfony\\Component\\OptionsResolver\\OptionsResolver; final class BadgeFieldType implements FieldTypeInterface { public function __construct( private DataExtractorInterface $dataExtractor, ) { } public function render(Field $field, $data, array $options): string { $value = $this-\u0026gt;dataExtractor-\u0026gt;get($field, $data); return sprintf( \u0026#39;\u0026lt;span class=\u0026#34;badge\u0026#34;\u0026gt;%s\u0026lt;/span\u0026gt;\u0026#39;, $value, ); } public function configureOptions(OptionsResolver $resolver): void { // Options don\u0026#39;t need to be configured for now. } } config/services.yamlservices: App\\FieldType\\BadgeFieldType: arguments: $dataExtractor: \u0026#39;@sylius.grid.data_extractor\u0026#39; tags: - { name: \u0026#39;sylius.grid_field\u0026#39;, type: \u0026#39;badge\u0026#39; } src/FieldType/Builder/BadgeField.php\u0026lt;?php declare(strict_types=1); namespace App\\FieldType\\Builder; use Sylius\\Bundle\\GridBundle\\Builder\\Field\\Field; use Sylius\\Bundle\\GridBundle\\Builder\\Field\\FieldInterface; final class BadgeField { public static function create(string $name): FieldInterface { return Field::create($name, \u0026#39;badge\u0026#39;); } } src/Grid/PostGrid.php\u0026lt;?php declare(strict_types=1); namespace App\\Grid; use App\\Entity\\Post; use App\\FieldType\\Builder\\BadgeField; use Sylius\\Bundle\\GridBundle\\Builder\\Field\\StringField; use Sylius\\Bundle\\GridBundle\\Builder\\GridBuilderInterface; use Sylius\\Bundle\\GridBundle\\Grid\\AbstractGrid; use Sylius\\Bundle\\GridBundle\\Grid\\ResourceAwareGridInterface; final class PostGrid extends AbstractGrid implements ResourceAwareGridInterface { public static function getName(): string { return \u0026#39;app_post\u0026#39;; } public function buildGrid(GridBuilderInterface $gridBuilder): void { $gridBuilder -\u0026gt;addField( BadgeField::create(\u0026#39;status\u0026#39;), ) -\u0026gt;addField(StringField::create(\u0026#39;title\u0026#39;)) ; } public function getResourceClass(): string { return Post::class; } } And voilà! After following these steps, you have successfully implemented a custom Sylius grid.\nThe custom badge field in the posts grid Playing with options # Creating such a field is relatively simple, but we haven’t covered options yet, so let’s explore that.\nImagine we want to render the label with different colors and translation keys depending on its type. This is where options come into play. We’ll keep it simple here, but note that Symfony’s OptionsResolver library defines options.\nWe will set two options: translationKeys and colors. When configuring the field, you can define values for these options. Let’s update the previous code:\nIn BadgeFieldType.php, the render method retrieves these values from the $options parameter, allowing us to determine the appropriate color and label to use for the field Since we added new options, let’s update the BadgeField.php builder so it’s easy to define them Finally, let’s update the PostGrid to specify colors and translation keys src/FieldType/BadgeFieldType.php src/FieldType/Builder/BadgeField.php src/Grid/PostGrid.php src/FieldType/BadgeFieldType.php\u0026lt;?php declare(strict_types=1); namespace App\\FieldType; use Sylius\\Component\\Grid\\DataExtractor\\DataExtractorInterface; use Sylius\\Component\\Grid\\Definition\\Field; use Sylius\\Component\\Grid\\FieldTypes\\FieldTypeInterface; use Symfony\\Component\\OptionsResolver\\OptionsResolver; use Symfony\\Contracts\\Translation\\TranslatorInterface; final class BadgeFieldType implements FieldTypeInterface { public function __construct( private DataExtractorInterface $dataExtractor, private TranslatorInterface $translator, ) { } public function render(Field $field, $data, array $options): string { $value = $this-\u0026gt;dataExtractor-\u0026gt;get($field, $data); return sprintf( \u0026#39;\u0026lt;span class=\u0026#34;badge bg-%s-lt\u0026#34;\u0026gt;%s\u0026lt;/span\u0026gt;\u0026#39;, $this-\u0026gt;getColor($value, $options[\u0026#39;colors\u0026#39;]), $this-\u0026gt;getLabel($value, $options[\u0026#39;translationKeys\u0026#39;]), ); } public function configureOptions(OptionsResolver $resolver): void { $resolver-\u0026gt;setDefault(\u0026#39;translationKeys\u0026#39;, []); $resolver-\u0026gt;setDefault(\u0026#39;colors\u0026#39;, []); } private function getColor(mixed $value, array $colors): mixed { return $colors[$value] ?? \u0026#39;secondary\u0026#39;; } private function getLabel(mixed $value, array $translationKeys): mixed { $translationKey = $translationKeys[$value] ?? null; if ($translationKey === null) { return $value; } return $this-\u0026gt;translator-\u0026gt;trans($translationKey); } } src/FieldType/Builder/BadgeField.php\u0026lt;?php declare(strict_types=1); namespace App\\FieldType\\Builder; use Sylius\\Bundle\\GridBundle\\Builder\\Field\\Field; use Sylius\\Bundle\\GridBundle\\Builder\\Field\\FieldInterface; final class BadgeField { public static function create( string $name, array $translationKeys = [], array $colors = [], ): FieldInterface { return Field::create($name, \u0026#39;badge\u0026#39;) -\u0026gt;setOption(\u0026#39;translationKeys\u0026#39;, $translationKeys) -\u0026gt;setOption(\u0026#39;colors\u0026#39;, $colors) ; } } src/Grid/PostGrid.php\u0026lt;?php declare(strict_types=1); namespace App\\Grid; use App\\Entity\\Post; use App\\FieldType\\Builder\\BadgeField; use Sylius\\Bundle\\GridBundle\\Builder\\Field\\StringField; use Sylius\\Bundle\\GridBundle\\Builder\\GridBuilderInterface; use Sylius\\Bundle\\GridBundle\\Grid\\AbstractGrid; use Sylius\\Bundle\\GridBundle\\Grid\\ResourceAwareGridInterface; final class PostGrid extends AbstractGrid implements ResourceAwareGridInterface { public static function getName(): string { return \u0026#39;app_post\u0026#39;; } public function buildGrid(GridBuilderInterface $gridBuilder): void { $gridBuilder -\u0026gt;addField( BadgeField::create( \u0026#39;status\u0026#39;, [ \u0026#39;draft\u0026#39; =\u0026gt; \u0026#39;app.ui.draft\u0026#39;, \u0026#39;published\u0026#39; =\u0026gt; \u0026#39;app.ui.published\u0026#39;, ], [ \u0026#39;draft\u0026#39; =\u0026gt; \u0026#39;secondary\u0026#39;, \u0026#39;published\u0026#39; =\u0026gt; \u0026#39;primary\u0026#39;, ], ), ) -\u0026gt;addField(StringField::create(\u0026#39;title\u0026#39;)) ; } public function getResourceClass(): string { return Post::class; } } Business logic stays in PHP We have an easy-to-configure and reusable BadgeFieldType. This is great because custom field types allow business logic to stay in PHP classes rather than Twig templates, allowing for more efficient creation of custom Sylius grids.\nColors and translation keys configured through options A new field type: CallableFieldType # Now that you know how to create custom field types, keep in mind that this approach can be time-consuming, especially for one-time use cases.\nTo simplify this process, I’ve implemented a new callable field type that will be available in the SyliusGridBundle. This field type enables you to configure a PHP callable to display your data, supporting both PHP and YAML grids.\nNot released yet The pull request for this new field type can be found on GitHub, though it has not been officially released yet.\nTo try it out, you must install the 1.14 branch of the bundle using Composer:\nTerminalcomposer require sylius/grid-bundle:1.14.x-dev Once installed, you can use the callable field in YAML by prefixing a callable with callable:. This supports both static methods and PHP functions.\nWhen configuring grids with PHP, you can use any callable, including arrays, services, and callback functions with Sylius grid to create a custom layout.\nconfig/packages/sylius_grid.yaml src/Grid/UserGrid.php config/packages/sylius_grid.yamlsylius_grid: grids: app_user: fields: id: type: callable options: callable: \u0026#34;callable:App\\\\Helper\\\\GridHelper::addHashPrefix\u0026#34; label: app.ui.id name: type: callable options: callable: \u0026#34;callable:strtoupper\u0026#34; label: app.ui.name src/Grid/UserGrid.php\u0026lt;?php declare(strict_types=1); namespace App\\Grid; use App\\Entity\\User; use App\\Helper\\GridHelper; use Sylius\\Bundle\\GridBundle\\Builder\\Field\\CallableField; use Sylius\\Bundle\\GridBundle\\Builder\\GridBuilderInterface; use Sylius\\Bundle\\GridBundle\\Grid\\AbstractGrid; use Sylius\\Bundle\\GridBundle\\Grid\\ResourceAwareGridInterface; final class UserGrid extends AbstractGrid implements ResourceAwareGridInterface { public static function getName(): string { return \u0026#39;app_user\u0026#39;; } public function buildGrid(GridBuilderInterface $gridBuilder): void { $gridBuilder -\u0026gt;addField( CallableField::create(\u0026#39;id\u0026#39;, GridHelper::addHashPrefix(...)) -\u0026gt;setLabel(\u0026#39;app.ui.id\u0026#39;) ) -\u0026gt;addField( CallableField::create(\u0026#39;name\u0026#39;, \u0026#39;strtoupper\u0026#39;) -\u0026gt;setLabel(\u0026#39;app.ui.name\u0026#39;) ) -\u0026gt;addField( CallableField::create(\u0026#39;roles\u0026#39;, fn (array $roles): string =\u0026gt; implode(\u0026#39;, \u0026#39;, $roles)) -\u0026gt;setLabel(\u0026#39;app.ui.roles\u0026#39;) ) ; } public function getResourceClass(): string { return User::class; } } This feature simplifies the definition of custom field types, reducing the need for TwigFieldType and custom templates while keeping your grid configuration clean and efficient. Stay tuned for updates on its release!\n👈 Previously in the series: Bring Sylius Components to Your Project.\nNeed custom grids for your Sylius back office? Grid fields, filters, actions, Sylius Stack: our Sylius experts design admin interfaces tailored to your business. Discover our Sylius expertise ","date":"19 janvier 2025","externalUrl":null,"permalink":"/creating-custom-sylius-grid-fields/","section":"Actualités","summary":"","title":"Creating Custom Sylius Grid Fields","type":"posts"},{"content":"","date":"19 janvier 2025","externalUrl":null,"permalink":"/series/","section":"Series","summary":"","title":"Series","type":"series"},{"content":"","date":"19 janvier 2025","externalUrl":null,"permalink":"/series/sylius-stack/","section":"Series","summary":"","title":"Sylius Stack","type":"series"},{"content":"","date":"19 janvier 2025","externalUrl":null,"permalink":"/tags/sylius-stack/","section":"Tags","summary":"","title":"Sylius Stack","type":"tags"},{"content":"","date":"12 janvier 2025","externalUrl":null,"permalink":"/realisation/","section":"Réalisations","summary":"","title":"Réalisations","type":"realisation"},{"content":"","date":"23 janvier 2025","externalUrl":null,"permalink":"/service/","section":"Services","summary":"","title":"Services","type":"service"},{"content":" Nous contacter # Vous avez un projet ? Une question à nous poser ? Besoin de rencontrer l’équipe ? Complétez le formulaire ci-dessous, un·e expert·e vous répondra dans les plus brefs délais.\nNom * Prénom * Téléphone Votre email * Votre projet, votre question * Site web Envoyer ma demande * Champs obligatoires\nLes informations saisies sont utilisées uniquement par AKAWAKA pour répondre à votre demande et sont conservées au maximum 3 ans après notre dernier échange. Vous pouvez y accéder, les rectifier ou demander leur effacement en écrivant à contact@akawaka.fr. En savoir plus : politique de confidentialité. Discutons de votre projet\nVous êtes plutôt téléphone ? On reste joignable du lundi au vendredi. 06 89 81 04 24 📞 Nous sommes présent·es partout en France # Lyon Lille Pau Avignon Vienne Melun Dans votre ville Nous intervenons dans toutes les villes de France pour satisfaire vos projets. N’hésitez plus, contactez nous ! ","date":"22 janvier 2025","externalUrl":null,"permalink":"/nous-contacter/","section":"Votre e-commerce doit évoluer. \u003cbr/\u003e Sa technologie aussi.","summary":"","title":"Parlez-nous de votre projet","type":"page"},{"content":" AKAWAKA est une équipe d’expert·es PHP spécialisée en Symfony, Sylius et Sulu. Audit, développement sur mesure, direction technique : nous concevons des plateformes web et e-commerce solides, et nous vous aidons à les faire évoluer dans la durée. Sans poudre aux yeux ni solution toute faite. Notre histoire\nUne agence technique née d’une conviction Un bon projet ne se résume pas à du code : il se pense, se structure et se transmet.\nAKAWAKA a été créée en janvier 2021 pour proposer un accompagnement technique qui va au-delà du développement. Très vite, l’agence s’est imposée comme une référence sur l’écosystème Symfony, puis sur Sylius et Sulu, en alliant expertise pointue, pédagogie et accompagnement sur mesure. Deux membres de l’équipe sont Sylius Key Contributors et participent à l’évolution du cœur de Sylius, et nous intervenons régulièrement en conférence dans l’écosystème PHP, Symfony et Sylius. Aujourd’hui, notre équipe travaille à distance, partout en France, aux côtés d’e-commerçant·es, d’ETI et de grands comptes.\nParlons de votre projet → 2021 Création d’AKAWAKA 2 Sylius Key Contributors dans l’équipe Sylius Partenaire officiel depuis 2022 Nos valeurs\nCe qui guide chacun de nos projets Pragmatisme, exigence et transparence : trois principes simples que nous appliquons au code comme à la relation client.\nTransmission et open source Le savoir ne reste pas entre quatre murs. Coaching, formation, contributions open source : nous partageons nos compétences pour que vos équipes gagnent en autonomie et en maîtrise.\nQualité Code lisible, architecture robuste, tests automatisés, suivi rigoureux. La qualité est la pierre angulaire de chacun de nos projets, et de notre manière de travailler.\nÉthique et transparence Si une idée est bancale, nous le disons. Si une solution peut être plus simple, nous l’expliquons. Notre objectif : ce qui fonctionne et ce qui dure, pas ce qui facture.\nOpen source \u0026amp; communauté\nContributeur·rices et speakers de l’écosystème PHP Nous ne nous contentons pas d’utiliser l’open source : nous y contribuons et partageons ce que nous apprenons, sur scène comme dans le code.\nSylius Key Contributors Deux membres de l’équipe font partie de la core team Sylius et participent activement à l’évolution du cœur du framework. Une connaissance de l’intérieur dont profitent directement nos projets e-commerce.\nSpeakers en conférence Talks, ateliers et retours d’expérience : nous intervenons régulièrement lors des événements PHP, Symfony et Sylius, en France et en Europe.\nForum PHP AFUP Day API Platform Conference phpday (Vérone, Italie) SymfonyCon SyliusCon Sylius Party Meetups Sylius Conférence Sylius Con 2025 : Pole position on the (Sylius) Grid - Estelle Gaits \u0026 Loïc Frémont.\nL’équipe\nDes expert·es, partout en France Six développeur·euses, réuni·es par le goût du travail bien fait.\nFabrice Lenoble\nDirecteur général\nFrédéric Perrin\nResponsable commercial\nKevin Balicot\nLead {dev,tech}\nSlides.com Christophe Plauchu\nDéveloppeur Sulu, Sylius, Symfony\nManuel Farrica\nDéveloppeur Sylius, Symfony\nValentin Silvestre\nDéveloppeur Sylius, Symfony\nSylius Key Contributor Site web Jean-Baptiste Mercier\nDéveloppeur Sylius, Symfony\nEstelle Gaits\nDéveloppeuse Symfony, Sylius\nSylius Key Contributor Speaker DeckSlides.com Ils nous font confiance\nSuivez-nous\nRetrouvez AKAWAKA en ligne Actualités de l’équipe, veille technique et contributions open source.\nGitHub Nos contributions et projets open source ↗ LinkedIn Actualités, recrutements et coulisses de l’équipe ↗ Un projet Symfony, Sylius ou Sulu ?\nParlons de votre plateforme Audit, reprise de projet, développement ou direction technique : expliquez-nous où vous en êtes, nous vous répondons rapidement. Nous contacter → ","date":"22 janvier 2025","externalUrl":null,"permalink":"/a-propos/","section":"Votre e-commerce doit évoluer. \u003cbr/\u003e Sa technologie aussi.","summary":"","title":"AKAWAKA, l’agence experte Symfony, Sylius et Sulu","type":"page"},{"content":" Sylius CRUD components are both powerful and highly extensible. When used correctly, they become incredible tools for building reliable, rapid application development (RAD) apps. Let’s see how to add Sylius components to your project. Historically, integrating Sylius bundles into a Symfony app has been a challenging task. There were two primary approaches:\nInstall the SyliusNoCommercePlugin into a Sylius app; Use Monofony, a stripped-down Sylius skeleton with all e-commerce features removed. Both of these solutions required using a skeleton app and couldn’t be seamlessly installed into an existing or barebones Symfony project.\nThankfully, those limitations are now a thing of the past. With the introduction of the Sylius Stack, you can use Sylius components in any Symfony project.\nThis blog post introduces the Sylius Stack, explains how you can leverage it in your projects (or a Sylius e-commerce project), and demonstrates how to efficiently customize Sylius resources.\nDemo app At the end of this blog post, you’ll find a link to the repository of a demo app that includes everything we’ll cover.\nGetting Started with the Stack # First, we need to install the stack. As mentioned earlier, this can be done in any Symfony project, whether it’s an existing one or a fresh installation.\nTo get started, run the following command:\nTerminalcomposer require sylius/admin-ui composer require sylius/bootstrap-admin-ui php bin/console asset-map:compile That’s it! With a few commands, you get everything you need for a working Sylius admin application. For more details on what’s included, check the composer.json of this package.\nAdditionally, the installation adds a minimal set of files to bootstrap:\nA dashboard, Login/logout routes, Templates for CRUD operations. With just a few steps, you’re ready to begin customizing and extending your admin interface using Sylius components.\nLet’s Create Our First Doctrine Entity: Movie # In Sylius, an entity that requires CRUD functionality should implement the ResourceInterface.\nFor our example, let’s create a Movie entity with the following properties:\nAn id, A title, A releaseDate, A list of actors. As stated above, only entities that need CRUD functionalities must implement the ResourceInterface. This is not the case for the Actor entity so we will not implement the interface.\nsrc/Entity/Movie.php src/Entity/Actor.php src/Entity/Movie.php\u0026lt;?php namespace App\\Entity; use Doctrine\\ORM\\Mapping as ORM; use Sylius\\Resource\\Metadata\\AsResource; use Sylius\\Resource\\Model\\ResourceInterface; use Symfony\\Component\\Validator\\Constraints as Constraints; #[ORM\\Entity] class Movie implements ResourceInterface { #[ORM\\Id] #[ORM\\GeneratedValue] #[ORM\\Column] public ?int $id = null; #[Constraints\\NotBlank] #[ORM\\Column(length: 180)] public string $title = \u0026#39;\u0026#39;; #[Constraints\\NotBlank] #[ORM\\Column(type: \u0026#39;date_immutable\u0026#39;)] public \\DateTimeImmutable $releaseDate; /** @var Collection\u0026lt;int, Actor\u0026gt; $actors */ #[Constraints\\Valid] #[ORM\\OneToMany( targetEntity: Actor::class, mappedBy: \u0026#39;movie\u0026#39;, cascade: [\u0026#39;persist\u0026#39;, \u0026#39;remove\u0026#39;], orphanRemoval: true, )] public Collection $actors; public function __construct( ) { $this-\u0026gt;actors = new ArrayCollection(); } public function getId(): ?int { return $this-\u0026gt;id; } public function addActor(Actor $actor): self { if (!$this-\u0026gt;actors-\u0026gt;contains($actor)) { $this-\u0026gt;actors[] = $actor; $actor-\u0026gt;movie = $this; } return $this; } public function removeActor(Actor $actor): self { $this-\u0026gt;actors-\u0026gt;removeElement($actor); return $this; } } src/Entity/Actor.php\u0026lt;?php namespace App\\Entity; use Doctrine\\ORM\\Mapping as ORM; use Symfony\\Component\\Validator\\Constraints as Constraints; #[ORM\\Entity] class Actor { #[ORM\\Id] #[ORM\\GeneratedValue] #[ORM\\Column] public ?int $id = null; #[ORM\\ManyToOne(targetEntity: Movie::class, cascade: [\u0026#39;persist\u0026#39;], inversedBy: \u0026#39;actors\u0026#39;)] #[ORM\\JoinColumn(nullable: false)] public Movie $movie; #[Constraints\\NotBlank] #[ORM\\Column(length: 180)] public string $name = \u0026#39;\u0026#39;; } You can now generate the database table with the command.\nTerminalphp bin/console doctrine:schema:update Other data providers While we use Doctrine to retrieve and save entities in this example, other data providers could be used.\nWhat Is a Sylius Resource? # Before going further, let’s take a step back and define what a resource is in the context of Sylius.\nA Sylius resource is essentially a model (usually a Doctrine entity) on steroids. It’s a basic entity enhanced with additional functionality, including:\nFactory: Creates new instances of the entity. Manager: An alias to Doctrine’s ObjectManager. Repository: Provides a repository for the entity. Controller: Handles CRUD operations. Form: Generates basic forms for creating and updating the resource. By defining your entity as a resource, Sylius automatically generates and wires everything you need for full CRUD operations and more. This reduces boilerplate code and ensures a consistent structure across your application.\nWhat about Actor? Since we don’t need CRUD operations for the Actor entity yet, it does not implement ResourceInterface. If we needed a factory or other resource functionalities, implementing the interface would make sense.\nAdding CRUD Operations # Now that we have our resource, we can add CRUD operations. In older versions of Sylius, this was only possible through PHP, YAML, or XML configuration. Now, we can use PHP attributes for this.\nLet’s update our resource:\nsrc/Entity/Movie.php\u0026lt;?php namespace App\\Entity; // ... use Sylius\\Resource\\Metadata\\AsResource; use Sylius\\Resource\\Metadata\\Create; use Sylius\\Resource\\Metadata\\Delete; use Sylius\\Resource\\Metadata\\Index; use Sylius\\Resource\\Metadata\\Show; use Sylius\\Resource\\Metadata\\Update; // ... #[AsResource( section: \u0026#39;admin\u0026#39;, templatesDir: \u0026#39;@SyliusAdminUi/crud\u0026#39;, routePrefix: \u0026#39;/admin\u0026#39;, operations: [ new Create(), new Index(), new Show(), new Update(), new Delete(), ], )] #[ORM\\Entity] class Movie implements ResourceInterface { // ... } We configured the following:\nA section, so the route name is prefixed with app_\u0026lt;section\u0026gt;_. A route prefix. The template directory for minimal styling. After running php bin/console debug:router, new routes will appear.\nphp bin/console debug:router | grep movie$ php bin/console debug:router | grep movie app_admin_movie_create GET|POST ANY ANY /admin/movies/new app_admin_movie_index GET ANY ANY /admin/movies app_admin_movie_show GET ANY ANY /admin/movies/{id} app_admin_movie_update GET|PUT|POST ANY ANY /admin/movies/{id}/edit app_admin_movie_delete DELETE|POST ANY ANY /admin/movies/{id}/delete It’s that easy! However, when accessing the index page, you’ll encounter an error. This is because we haven’t defined a Grid for this action yet.\nThe index page fails until a grid is defined The Grid # In the past, grid definitions could only be created using configuration files. With modern Sylius versions, grids can be defined as services, which is more flexible and allows us to construct grids using well-defined objects.\nA grid service must implement the ResourceAwareGridInterface. So let’s create the MovieGrid, configure the grid for the Index route and update the Movie entity accordingly.\nsrc/Grid/MovieGrid.php src/Entity/Movie.php src/Grid/MovieGrid.php\u0026lt;?php namespace App\\Grid; use App\\Entity\\Movie; use Sylius\\Bundle\\GridBundle\\Builder\\Action\\CreateAction; use Sylius\\Bundle\\GridBundle\\Builder\\Action\\DeleteAction; use Sylius\\Bundle\\GridBundle\\Builder\\Action\\ShowAction; use Sylius\\Bundle\\GridBundle\\Builder\\Action\\UpdateAction; use Sylius\\Bundle\\GridBundle\\Builder\\ActionGroup\\ItemActionGroup; use Sylius\\Bundle\\GridBundle\\Builder\\ActionGroup\\MainActionGroup; use Sylius\\Bundle\\GridBundle\\Builder\\Field\\DateTimeField; use Sylius\\Bundle\\GridBundle\\Builder\\Field\\StringField; use Sylius\\Bundle\\GridBundle\\Builder\\GridBuilderInterface; use Sylius\\Bundle\\GridBundle\\Grid\\AbstractGrid; use Sylius\\Bundle\\GridBundle\\Grid\\ResourceAwareGridInterface; final class MovieGrid extends AbstractGrid implements ResourceAwareGridInterface { public static function getName(): string { return \u0026#39;app_movie\u0026#39;; } public function buildGrid(GridBuilderInterface $gridBuilder): void { $gridBuilder -\u0026gt;addField( StringField::create(\u0026#39;id\u0026#39;) -\u0026gt;setEnabled(false) -\u0026gt;setSortable(true), ) -\u0026gt;addField( StringField::create(\u0026#39;title\u0026#39;) -\u0026gt;setSortable(true), ) -\u0026gt;addField( DateTimeField::create(\u0026#39;releaseDate\u0026#39;) -\u0026gt;setSortable(true), ) -\u0026gt;addActionGroup( MainActionGroup::create( CreateAction::create(), ), ) -\u0026gt;addActionGroup( ItemActionGroup::create( ShowAction::create(), UpdateAction::create(), DeleteAction::create() ), ) ; } public function getResourceClass(): string { return Movie::class; } } src/Entity/Movie.php\u0026lt;?php namespace App\\Entity; use App\\Grid\\MovieGrid; // ... #[AsResource( section: \u0026#39;admin\u0026#39;, templatesDir: \u0026#39;@SyliusAdminUi/crud\u0026#39;, routePrefix: \u0026#39;/admin\u0026#39;, operations: [ // .. new Index(grid: MovieGrid::class), // .. ], )] #[ORM\\Entity] class Movie implements ResourceInterface { // ... } After refreshing the page, no errors appear.\nThe movie index page, now backed by a grid Translations and menu I did not translate the app, but this can be done just like in any other Symfony application.\nTo add an entry to the sidebar, you need to decorate the sylius_admin_ui.knp.menu_builder service. Refer to the Sylius documentation for more details.\nCreating and Updating Movies # When accessing the create page, a basic form is already available. This is one of the strengths of Sylius resources: many features come pre-configured out of the box, covering both basic and specific needs.\nSince the Movie entity has a one-to-many relationship with the Actor entity, we need to create and configure the form.\nLet’s start by creating MovieType and ActorType, configure the form on the resource, define a LiveComponent for the form and update the part of the template where the form is rendered (this is done using Sylius Twig Hooks).\nsrc/Form/Type/MovieType.php src/Form/Type/ActorType.php src/Entity/Movie.php src/Twig/Components/MovieComponent.php config/packages/sylius_twig_hooks.yaml src/Form/Type/MovieType.php\u0026lt;?php namespace App\\Form\\Type; use App\\Entity\\Movie; use Symfony\\Component\\Clock\\ClockInterface; use Symfony\\Component\\Form\\AbstractType; use Symfony\\Component\\Form\\Extension\\Core\\Type\\DateType; use Symfony\\Component\\Form\\Extension\\Core\\Type\\TextType; use Symfony\\Component\\Form\\FormBuilderInterface; use Symfony\\Component\\OptionsResolver\\OptionsResolver; use Symfony\\UX\\LiveComponent\\Form\\Type\\LiveCollectionType; final class MovieType extends AbstractType { public function __construct( private ClockInterface $clock, ) { } public function buildForm(FormBuilderInterface $builder, array $options): void { $builder -\u0026gt;add(\u0026#39;title\u0026#39;, TextType::class, [ \u0026#39;empty_data\u0026#39; =\u0026gt; \u0026#39;\u0026#39;, ]) -\u0026gt;add(\u0026#39;releaseDate\u0026#39;, DateType::class, [ \u0026#39;input\u0026#39; =\u0026gt; \u0026#39;datetime_immutable\u0026#39;, \u0026#39;empty_data\u0026#39; =\u0026gt; $this-\u0026gt;clock-\u0026gt;now()-\u0026gt;format(\u0026#39;Y-m-d\u0026#39;), ]) -\u0026gt;add(\u0026#39;actors\u0026#39;, LiveCollectionType::class, [ \u0026#39;required\u0026#39; =\u0026gt; false, \u0026#39;entry_type\u0026#39; =\u0026gt; ActorType::class, \u0026#39;allow_add\u0026#39; =\u0026gt; true, \u0026#39;allow_delete\u0026#39; =\u0026gt; true, \u0026#39;by_reference\u0026#39; =\u0026gt; false, ]) ; } public function configureOptions(OptionsResolver $resolver): void { $resolver-\u0026gt;setDefaults([ \u0026#39;data_class\u0026#39; =\u0026gt; Movie::class, ]); } } src/Form/Type/ActorType.php\u0026lt;?php namespace App\\Form\\Type; use App\\Entity\\Actor; use Symfony\\Component\\Form\\AbstractType; use Symfony\\Component\\Form\\Extension\\Core\\Type\\TextType; use Symfony\\Component\\Form\\FormBuilderInterface; use Symfony\\Component\\OptionsResolver\\OptionsResolver; final class ActorType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options): void { $builder -\u0026gt;add(\u0026#39;name\u0026#39;, TextType::class, [ \u0026#39;label\u0026#39; =\u0026gt; \u0026#39;app.ui.name\u0026#39;, \u0026#39;empty_data\u0026#39; =\u0026gt; \u0026#39;\u0026#39;, ]) ; } public function configureOptions(OptionsResolver $resolver): void { $resolver-\u0026gt;setDefaults([ \u0026#39;data_class\u0026#39; =\u0026gt; Actor::class, ]); } } src/Entity/Movie.php\u0026lt;?php namespace App\\Entity; #[AsResource( // ... formType: MovieType::class, operations: [ // .. ], )] #[ORM\\Entity] class Movie implements ResourceInterface { // ... } src/Twig/Components/MovieComponent.php\u0026lt;?php namespace App\\Twig\\Components; use App\\Entity\\Movie; use App\\Form\\Type\\MovieType; use Sylius\\TwigHooks\\LiveComponent\\HookableLiveComponentTrait; use Symfony\\Bundle\\FrameworkBundle\\Controller\\AbstractController; use Symfony\\Component\\Form\\FormInterface; use Symfony\\UX\\LiveComponent\\Attribute\\AsLiveComponent; use Symfony\\UX\\LiveComponent\\Attribute\\LiveProp; use Symfony\\UX\\LiveComponent\\DefaultActionTrait; use Symfony\\UX\\LiveComponent\\LiveCollectionTrait; #[AsLiveComponent(template: \u0026#39;@SyliusBootstrapAdminUi/shared/crud/common/content/form.html.twig\u0026#39;)] class MovieComponent extends AbstractController { use LiveCollectionTrait; use DefaultActionTrait; use HookableLiveComponentTrait; #[LiveProp] public Movie $resource; protected function instantiateForm(): FormInterface { return $this-\u0026gt;createForm(MovieType::class, $this-\u0026gt;resource); } } config/packages/sylius_twig_hooks.yamlsylius_twig_hooks: hooks: \u0026#39;sylius_admin.movie.create.content\u0026#39;: form: component: \u0026#39;App\\Twig\\Components\\MovieComponent\u0026#39; props: form: \u0026#39;@=_context.form\u0026#39; resource: \u0026#39;@=_context.resource\u0026#39; \u0026#39;sylius_admin.movie.update.content\u0026#39;: form: component: \u0026#39;App\\Twig\\Components\\MovieComponent\u0026#39; props: form: \u0026#39;@=_context.form\u0026#39; resource: \u0026#39;@=_context.resource\u0026#39; Non-nullable properties Since all previously defined entity properties are non-nullable, a valid empty_data configuration is required. This includes using empty strings and Symfony’s Clock component.\nSylius Twig Hooks Sylius Twig Hooks allow you to override templates. They replace Sylius Template Events. This will be covered in more detail in a future blog post. In the meantime, you can check out the documentation to learn more.\nThe form is now fully functional, and actors can be added seamlessly.\nEditing a movie and its actors with a LiveCollectionType Duplicating a Movie # We’ve covered the basics, but let’s explore additional capabilities by adding the ability to duplicate a movie. This will allow us to create a new movie based on an existing one.\nTo achieve this, we add a second Create operation with custom configuration.\nThe new operation includes:\nshortName: The route name will be suffixed with _\u0026lt;shortName\u0026gt;. path: Since a standard create action already exists, we specify a custom path for the duplicate route. template: Sylius uses the shortName to determine the template, but here we want to reuse the create template, so it must be explicitly specified. factoryMethod: The method used to construct the base entity. factoryArguments: The arguments passed to the factory method. So, we decorate the base factory for the Movie entity using the AsDecorator attribute.\nThe final step is to add the duplicate action to the MovieGrid. Using Action::create(), we can define generic actions with custom routes, parameters, labels, icons, and more.\nsrc/Entity/Movie.php src/Factory/MovieFactory.php src/Grid/MovieGrid.php src/Entity/Movie.php\u0026lt;?php declare(strict_types=1); namespace App\\Entity; // .. use Sylius\\Resource\\Metadata\\Create; // .. #[AsResource( // ... operations: [ new Create(), new Create( shortName: \u0026#39;duplicate\u0026#39;, path: \u0026#39;movies/{id}/duplicate\u0026#39;, template: \u0026#39;@SyliusAdminUi/crud/create.html.twig\u0026#39;, factoryMethod: \u0026#39;createFromMovie\u0026#39;, factoryArguments: [\u0026#39;request.attributes.get(\u0026#34;id\u0026#34;)\u0026#39;], ), // ... ], )] #[ORM\\Entity] class Movie implements ResourceInterface { // ... } src/Factory/MovieFactory.php\u0026lt;?php namespace App\\Factory; use App\\Entity\\Actor; use App\\Entity\\Movie; use Sylius\\Bundle\\ResourceBundle\\Doctrine\\ORM\\EntityRepository; use Sylius\\Resource\\Factory\\FactoryInterface; use Symfony\\Component\\DependencyInjection\\Attribute\\AsDecorator; #[AsDecorator(decorates: \u0026#39;app.factory.movie\u0026#39;)] final class MovieFactory implements FactoryInterface { public function __construct( private FactoryInterface $baseFactory, private EntityRepository $movieRepository, ) { } public function createNew(): Movie { return $this-\u0026gt;baseFactory-\u0026gt;createNew(); } public function createFromMovie(string $id): Movie { $old = $this-\u0026gt;movieRepository-\u0026gt;findOneBy([\u0026#39;id\u0026#39; =\u0026gt; $id]); $new = $this-\u0026gt;baseFactory-\u0026gt;createNew(); $new-\u0026gt;title = $old-\u0026gt;title; $new-\u0026gt;releaseDate = $old-\u0026gt;releaseDate; foreach ($old-\u0026gt;actors as $oldActor) { $newActor = new Actor(); $newActor-\u0026gt;name = $oldActor-\u0026gt;name; $new-\u0026gt;addActor($newActor); } return $new; } } src/Grid/MovieGrid.php\u0026lt;?php namespace App\\Grid; // ... final class MovieGrid extends AbstractGrid implements ResourceAwareGridInterface { public static function getName(): string { return \u0026#39;app_movie\u0026#39;; } public function buildGrid(GridBuilderInterface $gridBuilder): void { $gridBuilder // ... -\u0026gt;addActionGroup( ItemActionGroup::create( // ... Action::create(\u0026#39;duplicate\u0026#39;, \u0026#39;create\u0026#39;) -\u0026gt;setLabel(\u0026#39;app.ui.duplicate\u0026#39;) -\u0026gt;setOptions([ \u0026#39;link\u0026#39; =\u0026gt; [ \u0026#39;route\u0026#39; =\u0026gt; \u0026#39;app_admin_movie_duplicate\u0026#39;, \u0026#39;parameters\u0026#39; =\u0026gt; [ \u0026#39;id\u0026#39; =\u0026gt; \u0026#39;resource.id\u0026#39;, ], ], ]), // ... ), ) ; } public function getResourceClass(): string { return Movie::class; } } Autowired repository Thanks to the Sylius Resource Bundle, EntityRepository $movieRepository is automatically aliased to the app.repository.movie service. No additional service configuration is required to wire the repository.\nAnd voilà! Duplicating a resource is now available.\nThe new Duplicate action in the movie grid Soft Deleting Entities # Let’s take things further with processors by implementing soft deletion using an archive boolean property.\nFirst, we add the new property to the entity and update the Delete operation to use a processor that handles the soft delete logic.\nThen, we’ll use a Sylius processor which implements ProcessorInterface to set the archive property to true.\nNow, when clicking the Delete button, the resource won’t be removed from the database. Instead, its archive property will be updated.\nTo make this behavior easier to visualize, we add a grid filter and a grid field for the archive property.\nsrc/Entity/Movie.php src/Processor/MovieArchiveProcessor.php src/Grid/MovieGrid.php src/Entity/Movie.php\u0026lt;?php declare(strict_types=1); namespace App\\Entity; // .. use App\\Processor\\MovieArchiveProcessor; // .. #[AsResource( // ... operations: [ // ... new Delete(processor: MovieArchiveProcessor::class), ], )] #[ORM\\Entity] class Movie implements ResourceInterface { // ... #[ORM\\Column(type: \u0026#39;boolean\u0026#39;)] public bool $archived = false; // ... } src/Processor/MovieArchiveProcessor.php\u0026lt;?php namespace App\\Processor; use Doctrine\\ORM\\EntityManagerInterface; use Sylius\\Resource\\State\\ProcessorInterface; final class MovieArchiveProcessor implements ProcessorInterface { public function __construct( private EntityManagerInterface $em, ) { } public function process(mixed $data, Operation $operation, Context $context): mixed { $data-\u0026gt;archived = true; $this-\u0026gt;em-\u0026gt;flush(); return null; } } src/Grid/MovieGrid.php\u0026lt;?php namespace App\\Grid; use Sylius\\Bundle\\GridBundle\\Builder\\Field\\StringField; use Sylius\\Bundle\\GridBundle\\Builder\\Filter\\BooleanFilter; final class MovieGrid extends AbstractGrid implements ResourceAwareGridInterface { public static function getName(): string { return \u0026#39;app_movie\u0026#39;; } public function buildGrid(GridBuilderInterface $gridBuilder): void { $gridBuilder -\u0026gt;addFilter( BooleanFilter::create(\u0026#39;archived\u0026#39;) -\u0026gt;setLabel(\u0026#39;app.ui.archived\u0026#39;) -\u0026gt;setDefaultValue(\u0026#39;false\u0026#39;), ) -\u0026gt;addField( StringField::create(\u0026#39;archived\u0026#39;), ) // ... ; } public function getResourceClass(): string { return Movie::class; } } Deleting an entity now results in soft deletion, and the resource can still be accessed by filtering the grid.\nSoft-deleted movies remain reachable through the Archived filter Bring Sylius Components to Your Project — Conclusion # I hope this article has helped you understand how to work with Sylius resources and customize CRUD operations effectively. We’ve covered key features, including:\nUsing processors to extend functionality; Leveraging LiveCollectionType to manage more complex forms for your resources; Adding custom actions and defining them with flexibility; Creating grids and seamlessly integrating resource-based CRUD operations. These tools allow you to take full advantage of Sylius components while keeping your project clean and maintainable.\nWhat’s Next? # Sylius resources offer even more capabilities. In upcoming articles, I’ll cover:\nIntegrating API Platform with Sylius resources; Writing tests for Sylius applications; Customizing templates with Sylius Twig Hooks. In the meantime, check out the Sylius Stack documentation for a comprehensive guide and deeper insights into Sylius components.\nYou can find the complete demo application with all the features covered in this blog post in the following repository: Sylius Stack Demo.\nYou need some help on your Sylius project? Our Sylius experts can help you.\nHappy coding! 🚀\n👉 Next in the series: Creating Custom Sylius Grid Fields.\nBuilding a back office with the Sylius Stack? Resources, grids, Twig Hooks, admin UI: our Sylius experts, including 4 key contributors, help you build robust and maintainable applications. Discover our Sylius expertise ","date":"19 janvier 2024","externalUrl":null,"permalink":"/bring-sylius-components-to-your-project/","section":"Actualités","summary":"","title":"Bring Sylius Components to Your Project","type":"posts"},{"content":"","date":"3 janvier 2024","externalUrl":null,"permalink":"/tags/css/","section":"Tags","summary":"","title":"CSS","type":"tags"},{"content":"","date":"3 janvier 2024","externalUrl":null,"permalink":"/tags/design-system/","section":"Tags","summary":"","title":"Design System","type":"tags"},{"content":"","date":"3 janvier 2024","externalUrl":null,"permalink":"/series/design-systems/","section":"Series","summary":"","title":"Design Systems","type":"series"},{"content":"","date":"3 janvier 2024","externalUrl":null,"permalink":"/categories/outils/","section":"Categories","summary":"","title":"Outils","type":"categories"},{"content":"","date":"3 janvier 2024","externalUrl":null,"permalink":"/tags/react/","section":"Tags","summary":"","title":"React","type":"tags"},{"content":"","date":"3 janvier 2024","externalUrl":null,"permalink":"/tags/storybook/","section":"Tags","summary":"","title":"Storybook","type":"tags"},{"content":" Vous avez déjà exploré les concepts de design systems et d’atomic design. Vous savez qu’ils permettent de créer des interfaces modulaires, évolutives et élégantes. Mais comment passer de la théorie à la pratique ? Avec Storybook, React et TailwindCSS, vous avez tous les outils pour aller plus loin. Dans cet article, on va voir comment ces trois technologies travaillent ensemble pour rendre vos interfaces non seulement réutilisables, mais aussi faciles à maintenir, cohérentes et agréables à coder.\nUne suite logique : du concept à la mise en pratique # Partie 2 de la série Si vous n’avez pas encore lu notre premier article, Design Systems et Atomic Design : Les Alliés Insoupçonnés du Développeur Front-End, nous y explorons les bases théoriques de l’atomic design et des design systems, ainsi que leur impact sur la conception et le développement d’interfaces modernes. Dans cette deuxième partie, nous allons encore plus loin en vous montrant comment ces concepts prennent vie grâce à des outils concrets : Storybook, React et TailwindCSS. Prenez un moment pour lire le premier article si ce n’est pas encore fait, puis revenez ici pour découvrir comment passer de la théorie à la pratique ! 🚀\nStorybook : l’atelier central de vos composants # Storybook Composants isolés Storybook est bien plus qu’un simple outil pour prévisualiser des composants. C’est l’atelier où vos briques d’interface prennent vie. Tout commence ici : chaque composant est conçu, testé, et documenté avant d’être empaqueté pour être utilisé ailleurs.\nPourquoi utiliser Storybook ? # Un environnement isolé : vous développez vos composants sans dépendre du contexte global de votre projet. Pas besoin de démarrer toute l’application pour voir vos changements. Documenter et tester : chaque variante (taille, état, style) devient une “histoire” visible par toute l’équipe. Cohérence garantie : une fois vos composants prêts, ils peuvent être publiés dans une bibliothèque et utilisés dans plusieurs projets, sans duplication de code. React et TailwindCSS : une symbiose naturelle # React TailwindCSS React et TailwindCSS forment une équipe parfaite pour construire vos composants dans Storybook. React fournit la structure et la logique, tandis que TailwindCSS gère les styles avec des classes utilitaires simples et puissantes.\nCependant, utiliser Tailwind directement dans vos templates peut poser des problèmes si on n’est pas vigilant.\nLes pièges de l’utilisation directe # Quand vous utilisez Tailwind pour styliser vos composants directement dans les templates HTML ou JSX, deux problèmes majeurs apparaissent :\nDuplication des classes : si vous appliquez les mêmes styles à plusieurs endroits, chaque modification future nécessitera une mise à jour manuelle dans tout le projet. Incohérences : à mesure que le projet grandit, les styles deviennent difficiles à maintenir, et les divergences s’accumulent. Et @apply ? Pour contourner cela, certains développeurs optent pour @apply dans leurs fichiers CSS. Mais cette approche n’est pas idéale. Elle revient à recréer les problèmes du CSS classique tout en ajoutant une couche de complexité inutile avec Tailwind. Vous perdez le principal avantage de Tailwind : des styles déclaratifs, co-localisés dans le code.\nLa bonne pratique : centraliser dans des composants # Avec React, la meilleure solution est de centraliser vos styles directement dans vos composants. Voici pourquoi :\nRéutilisabilité : vous définissez les styles une fois et utilisez vos composants partout dans le projet. Cohérence : toute modification dans le composant se répercute automatiquement sur toutes ses instances. Lisibilité : vos styles et votre logique sont co-localisés, ce qui rend le code plus facile à comprendre et à maintenir. Exemple : un composant bouton # components/Button.jsxconst Button = ({ children, variant = \u0026#39;primary\u0026#39;, ...props }) =\u0026gt; { const baseClasses = \u0026#39;px-4 py-2 font-bold rounded\u0026#39;; const variantClasses = variant === \u0026#39;primary\u0026#39; ? \u0026#39;bg-blue-500 text-white hover:bg-blue-600\u0026#39; : \u0026#39;bg-gray-200 text-gray-700 hover:bg-gray-300\u0026#39;; return ( \u0026lt;button className={`${baseClasses} ${variantClasses}`} {...props}\u0026gt; {children} \u0026lt;/button\u0026gt; ); }; Le bénéfice Ce bouton est compact, facile à lire et réutilisable. Plus besoin de copier/coller des classes ou de gérer des styles globaux.\nAtomic Design avec Storybook, React et TailwindCSS # Atomic design Design tokens L’approche atomic design s’intègre naturellement dans ce workflow. Voici comment elle se déploie :\n1 Atomes Les propriétés CSS de base deviennent vos atomes (couleurs, tailles, espaces).\nexport const colors = { primary: \u0026#39;bg-blue-500\u0026#39;, secondary: \u0026#39;bg-gray-200\u0026#39;, }; 2 Molécules Combinez vos atomes pour créer des composants simples comme un bouton ou une carte produit.\nconst ProductCard = ({ title, imageUrl, price }) =\u0026gt; ( \u0026lt;div className=\u0026#34;max-w-sm bg-white border border-gray-200 rounded-lg shadow-md\u0026#34;\u0026gt; \u0026lt;img src={imageUrl} alt={title} /\u0026gt; \u0026lt;div className=\u0026#34;p-4\u0026#34;\u0026gt; \u0026lt;h3 className=\u0026#34;text-lg font-bold\u0026#34;\u0026gt;{title}\u0026lt;/h3\u0026gt; \u0026lt;p className=\u0026#34;text-gray-700\u0026#34;\u0026gt;${price}\u0026lt;/p\u0026gt; \u0026lt;button className=\u0026#34;mt-4 bg-blue-500 text-white px-4 py-2 rounded hover:bg-blue-600\u0026#34;\u0026gt; Add to Cart \u0026lt;/button\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; ); 3 Organismes et pages Combinez les molécules pour former des structures plus grandes, comme des headers ou des pages entières. Le design system et TailwindCSS : un mariage évident # TailwindCSS est intrinsèquement compatible avec les principes des design systems. Avec son approche déclarative et son ensemble limité de propriétés CSS, il encourage naturellement la cohérence et l’évolutivité.\nAvec Storybook, chaque composant devient une pièce autonome de votre design system. Et comme vous publiez vos composants sous forme de bibliothèque, toute modification dans vos atomes (par exemple, une couleur primaire) se répercute automatiquement partout.\nToutes les variantes d’un même composant bouton, documentées dans Storybook Un workflow simplifié et puissant # Workflow type avec Storybook, React et TailwindCSS :\n1 Créez vos atomes Définissez les styles de base (couleurs, tailles, marges). 2 Assemblez vos molécules dans Storybook Testez et documentez chaque variante de composant. 3 Publiez votre bibliothèque Grâce à des outils comme Rollup ou Vite, empaquetez vos composants pour les intégrer dans vos projets. 4 Appliquez les changements globalement Modifiez un atome ou un composant, et voyez les changements se propager partout. Storybook, React et TailwindCSS — Conclusion # Avec Storybook, React, et TailwindCSS, vous avez les outils parfaits pour passer d’une approche théorique de l’atomic design et des design systems à une implémentation fluide et maintenable.\nStorybook : votre laboratoire de composants. React : la structure modulaire de vos interfaces. TailwindCSS : un framework déclaratif qui aligne parfaitement vos composants avec votre design system. Ensemble, ils vous permettent de construire des interfaces élégantes, évolutives et cohérentes. Et surtout, vous gagnez du temps tout en créant des bases solides pour vos projets futurs. 🚀\n👈 Retour à la théorie : Design Systems et Atomic Design – Les Alliés Insoupçonnés du Développeur Front-End.\nUne bibliothèque de composants pour vos projets ? Storybook, React, TailwindCSS : nos équipes conçoivent des design systems et des composants réutilisables, documentés et faciles à maintenir. Découvrir notre offre de développement ","date":"3 janvier 2024","externalUrl":null,"permalink":"/storybook-react-et-tailwindcss-construire-des-interfaces-fluides-et-coherentes/","section":"Actualités","summary":"","title":"Storybook, React et TailwindCSS – Construire des Interfaces Fluides et Cohérentes","type":"posts"},{"content":" Les design systems et l’atomic design sont des termes à la mode, mais ce ne sont pas que des buzzwords. Ils représentent une vraie révolution dans la façon de concevoir et coder des interfaces. Pourtant, une grande partie de leurs atouts reste encore sous-explorée. En tant que développeur front-end, il y a beaucoup plus à découvrir qu’une simple bibliothèque de composants ou une checklist de bonnes pratiques. Prenons un peu de recul et explorons des angles frais sur ces méthodologies incontournables !\nAtomic Design : construire comme un chimiste # Atomic design Composants L’atomic design repose sur une analogie simple mais puissante : décomposer une interface comme un chimiste décomposerait la matière. Chaque composant a sa place dans une hiérarchie, ce qui rend la conception modulaire et intuitive. Voici comment cela fonctionne avec des exemples concrets :\n1 Atomes : les éléments les plus simples Exemple : un bouton, une icône, une couleur primaire.\n\u0026lt;button\u0026gt;Envoyer\u0026lt;/button\u0026gt; 2 Molécules : des atomes qui travaillent ensemble Exemple : un champ de recherche composé d’un champ de texte et d’un bouton.\n\u0026lt;div\u0026gt; \u0026lt;input placeholder=\u0026#34;Rechercher\u0026#34;/\u0026gt;\u0026lt;button\u0026gt;Chercher\u0026lt;/button\u0026gt; \u0026lt;/div\u0026gt; 3 Organismes : des ensembles plus complexes Exemple : un header complet avec un logo, un menu de navigation et un champ de recherche. Le vrai génie Mais là où cela devient intéressant, c’est que cette hiérarchie est pensée pour évoluer. Vous ne codez pas une fonctionnalité figée : vous construisez des briques qui pourront être déplacées et réassemblées ailleurs. Le vrai génie ? Tout ça est réutilisable.\nDesign Systems : plus qu’un guide de style # Design system Collaboration Un design system, c’est bien plus qu’une bibliothèque de boutons ou une palette de couleurs. C’est une source unique de vérité pour les designers, développeurs et même les rédacteurs. Mais attention, il ne s’agit pas de rigidité.\nLe design system comme outil de collaboration # Le design system n’est pas qu’un outil technique, c’est un langage commun.\nExemple Imaginez un développeur qui discute avec un designer. Plutôt que de s’embrouiller sur “le petit bouton bleu là-bas”, ils parlent tous les deux de ButtonPrimary. Plus de confusion, moins de perte de temps.\nL’évolutivité au cœur du système # Avec un design system bien structuré, il est facile de mettre à jour un composant sans casser toute l’interface.\nExemple Si le style du bouton principal change, vous modifiez le composant global, et tout le site est à jour en quelques clics.\nQuelques perspectives rafraîchissantes # Vous connaissez déjà les avantages classiques (cohérence, rapidité, collaboration). Mais voici des axes moins explorés où les design systems et l’atomic design brillent :\nL’accessibilité intégrée dès le départ # Les normes d’accessibilité peuvent être complexes à appliquer, mais en intégrant des bonnes pratiques dès la création des composants, vous simplifiez tout.\nExemple Un bouton PrimaryButton peut inclure par défaut des propriétés ARIA, un contraste suffisant et une prise en charge clavier. Pas besoin d’y penser à chaque fois !\nDes tests plus simples et plus fiables # Quand chaque composant est indépendant, il est facile de le tester isolément.\nExemple Avec des outils comme Storybook, vous pouvez visualiser, documenter et tester chaque molécule ou organisme sans lancer toute l’application.\nUn meilleur design… même pour les développeurs # Oui, les développeurs aiment le design, mais souvent pas de la même manière que les designers. Le design system rend la conception plus rationnelle, avec des règles claires et des limites utiles.\nExemple Vous ne vous demandez plus si le bouton doit avoir un coin arrondi ou carré. Le design system l’a décidé pour vous. Plus de débats interminables.\nEt dans la vraie vie ? # Voici un exemple simple d’un workflow basé sur ces concepts :\n1 Un designer crée une carte produit Elle inclut un titre, une image, un prix, et un bouton “Acheter”. 2 Le développeur décompose cette carte en atomes et molécules Atome : bouton ButtonPrimary. Molécule : image et texte côte à côte. Organisme : la carte entière. 3 Le design system fait le lien Les styles, les marges, et les comportements sont déjà définis dans le design system. 4 Tout le monde gagne du temps Le designer n’a pas besoin de réinventer la roue pour la prochaine page, et le développeur sait exactement quels composants utiliser. Conclusion : un monde plus simple (et plus fun) # Les design systems et l’atomic design ne sont pas seulement des outils techniques. Ils sont des manières de penser, des solutions qui rendent nos vies de développeurs front-end plus agréables. Ils nous libèrent des tâches répétitives et nous permettent de nous concentrer sur ce qui compte vraiment : créer des expériences utilisateur fluides et élégantes.\nAlors, la prochaine fois que vous créez un bouton, un champ de recherche ou une carte produit, pensez comme un chimiste ou un architecte. Vous ne construisez pas un simple site. Vous posez les fondations d’un système pensé pour durer. Et ça, c’est plutôt cool.\n👉 La suite, de la théorie à la pratique : Storybook, React et TailwindCSS – Construire des interfaces fluides et cohérentes.\nUn design system pour vos interfaces ? Composants réutilisables, accessibilité, cohérence entre design et code : nos équipes conçoivent des interfaces pensées pour durer. Découvrir notre offre de développement ","date":"28 janvier 2024","externalUrl":null,"permalink":"/design-systems-et-atomic-design-les-allies-insoupconnes-du-developpeur-front-end/","section":"Actualités","summary":"","title":"Design Systems et Atomic Design – Les Alliés Insoupçonnés du Développeur Front-End","type":"posts"},{"content":" Pour la première fois, la Sylius Con posait ses valises en France, à Lyon, au Centre de Congrès. Deux journées de conférences, d’annonces et de rencontres autour de l’écosystème Sylius : sortie officielle de la version 2.0, remise de prix communautaires, retours d’expérience de marchands et plongées techniques dans les plugins, l’API et le front-end. Voici les moments qui nous ont marqués. Keynote d’ouverture — Sylius 2.0 est là # Keynote Sylius 2.0 Communauté L’annonce officielle de la version 2.0 a ouvert cette édition — une étape majeure pour le framework. Félicitations à toute l’équipe pour le travail accompli !\nUne remise de prix a également été organisée pour honorer les contributeurs de la communauté Sylius. À cette occasion, Loïc Frémont (développeur chez AKAWAKA) a été récompensé pour son rôle de “Key Core Contributor” — une belle reconnaissance pour son engagement continu auprès du core team Sylius et des nombreuses contributions apportées au framework au fil des mois.\nUn grand bravo à lui, et merci à l’équipe Sylius pour ce geste envers la communauté.\nJoachim Løvgaard — Create World-Class Sylius Plugins # Plugins Bonnes pratiques Qualité de code Joachim Løvgaard partage un condensé de bonnes pratiques pour créer des plugins Sylius robustes, maintenables et agréables à intégrer.\nLes règles d’or # Déclarer explicitement ses dépendances dans le composer.json (voir le plugin Meilisearch de Setono) pour garantir la compatibilité avec les autres plugins et versions de Sylius. Suivre strictement le semantic versioning (MAJOR.MINOR.PATCH). Préfixer la configuration des extensions pour éviter que l’utilisateur ait à inclure des fichiers de configuration planqués dans les vendors. Créer ses propres entités dédiées plutôt que de demander d’implémenter des interfaces sur les classes de l’applicatif (source de bruit et de confusion). Utiliser des DTO et Value Objects en entrée/sortie pour mieux structurer les données. Préférer les data providers aux repositories, pour éviter les collisions entre plugins et avec l’applicatif. Publier des événements aux moments clés plutôt que de forcer la décoration — plus simple à maintenir en upgrade. Côté outillage # Tests fonctionnels et d’intégration systématiques. Mutation testing pour vérifier la qualité de ses tests. Analyse statique au niveau le plus strict (PHPStan niveau max). CI GitHub Actions — gratuit, déjà fourni dans les squelettes. Démarrer depuis le squelette officiel ou celui de Setono, qui embarquent déjà toutes ces pratiques. À noter À noter : Joachim est revenu sur ces thèmes à la Sylius Party 2025 avec une version enrichie, intégrant l’usage d’outils d’IA comme assistants de développement.\nJacques Bodin-Hullin — Sylius Beyond E-commerce: Building the Perfect WordPress Competitor # CMS Monofony Monsieur Biz Jacques Bodin-Hullin (Monsieur Biz) part d’un constat frappant : WordPress propulse 44 % d’Internet (493 millions de sites, 30 000 thèmes, 70 000 plugins), et WooCommerce équipe 35 % des sites e-commerce. Face à ce rouleau compresseur, Sylius peut-il devenir une alternative crédible, y compris hors e-commerce ?\nLes briques Monsieur Biz pour y arriver # SyliusRichEditorPlugin : un éditeur de pages par grille (lignes/colonnes) et UiElements — chaque élément combinant un FormType, deux templates (admin/front) et une classe pour la logique. L’intégration de Live Components est au programme. SettingsPlugin : fine-tuning via UI (par exemple pour configurer Doofinder). CmsBlockPlugin \u0026amp; CmsPagePlugin : blocs réutilisables, pages personnalisées et home pages. MenuPlugin : gestion des menus front. MediaManagerPlugin : sélection centralisée des médias. BlogPlugin : fonctionnalités de blog. Et pour retirer la partie e-commerce ? # Deux approches complémentaires :\nMonofony : fork de Sylius sans la couche e-commerce, pour démarrer un projet Symfony avec un back-office déjà cablé. NoCommercePlugin : désactive proprement les composants e-commerce de Sylius, pièce par pièce. À retenir Une stack proche de WordPress sur la richesse fonctionnelle, mais avec la maîtrise totale du code et la robustesse d’un framework Symfony.\nHélèna Gravelier \u0026amp; Hugo Roche — E-commerce Replatforming: Strategy and Challenges # Retour d’expérience Headless Omnicanal Luxe L’agence Bongénie a repensé son e-commerce autour d’une nouvelle plateforme Sylius, dans le cadre d’une stratégie omnicanale visant à fluidifier le parcours client et mieux intégrer online et offline.\nLes défis # S’adapter à l’évolution du marché du luxe et aux nouvelles attentes clients. Améliorer l’expérience utilisateur sur mobile. Intégrer de nombreuses fonctionnalités : personnalisation des prix, programme de fidélité, FAQ contextuelle… Gérer un catalogue complexe avec 400 marques. Assurer une transition en douceur pour les clients et les équipes internes. Les clés de la réussite # Une organisation agile et une collaboration étroite entre Bongénie et l’intégrateur. L’implication des métiers dès la phase de cadrage. Un accompagnement au changement soigné. Le choix de Sylius en headless, pour la flexibilité et la richesse d’intégrations. Premiers résultats Une plateforme plus performante, une meilleure expérience utilisateur et des workflows internes optimisés.\nBlandine \u0026amp; Julien Jacottet — When Sylius Meets Beer: A Refresh That’s Brewing Up a Storm # Retour d’expérience Abonnements Multi-boutique Mezcalito Blandine (cheffe de projet) et Julien Jacottet (CTO de Mezcalito) racontent la refonte d’Une Petite Mousse, box de bières grenobloise : 150 000 colis par an, 5 000 box par mois, une saisonnalité très marquée (coucou Noël), et un site vieillissant depuis 2013.\nLes objectifs # Moderniser l’UX en mobile-first avec un checkout optimisé. Améliorer la gestion des abonnements. Donner de l’autonomie à l’équipe marketing côté administration. Préparer une seconde boutique (fromage) sur la même stack. La migration en deux temps # 1 Avril 2023 — Box \u0026amp; abonnements Première partie de la refonte : parcours d’abonnement (durée, composition, date de démarrage, mode de livraison), options cadeaux, personnalisation du message, date d’envoi. 2 Septembre 2023 — Boutique fromage Rapatriement de la boutique Shopify vers Sylius, intégrée rapidement dans l’écosystème existant. Les bénéfices côté client # Plus d’autonomie pour l’équipe marketing (offres de masse, configuration produits, SEO). Un support simplifié. Une hausse du trafic organique et un meilleur référencement des pages de vente. Un profil client élargi grâce aux cadeaux, aux ventes à l’unité et à l’ouverture au B2B. Francis Hilaire — Sylius Payment Overview and Future # Payment Request Payum Asynchrone Francis Hilaire présente l’évolution majeure du système de paiement de Sylius avec l’arrivée de Payment Request, qui vient compléter — et à terme remplacer — l’intégration historique via Payum.\nPourquoi faire évoluer Payum ? # Payum est historiquement difficile à maîtriser et à déboguer, et ne gère pas nativement les flux asynchrones, pourtant indispensables à l’heure des plateformes API et des webhooks.\nLes apports de Payment Request # Gestion des paiements asynchrones (webhooks, messages). Intégration simplifiée de nouvelles méthodes de paiement. Développement de plugins de paiement plus simple. Possibilité d’utiliser Payum en API, sans interaction UI. Comment ça fonctionne # Un système de commandes gère les actions (capture, autorisation, remboursement…). Chaque méthode de paiement choisit librement d’utiliser Payum ou non. Des événements permettent de réagir aux changements d’état et d’adapter le comportement. Et après ? La suite : simplification du code, meilleure sécurité, documentation complète et exemples de plugins — autant d’étapes qui dessinent une base de paiement moderne et extensible pour Sylius.\nLoïc Caillieux — Boost Your Sylius Frontend with Hotwire (Symfony UX) # Hotwire Symfony UX Turbo Stimulus Loïc Caillieux (Emagma) plonge dans Hotwire et son intégration avec Sylius 2.0 pour construire des interfaces e-commerce dynamiques sans frameworks JS lourds.\nLes trois piliers de Turbo # Turbo Drive : rechargements partiels de pages, navigation accélérée. Turbo Frames : mise à jour ciblée de sections. Turbo Streams : diffusion de mises à jour en temps réel. L’intégration avec Sylius 2.0 se fait de manière transparente, moyennant quelques ajustements pour la cohabitation avec Bootstrap (nouvelle base front de Sylius 2.0).\nStimulus complète l’arsenal avec des contrôleurs légers pour gérer les interactions spécifiques (ajout au panier, validation de formulaires, etc.).\nQuasi sans JavaScript Le combo Hotwire + Symfony UX permet d’atteindre une boutique vraiment dynamique quasi sans JavaScript. Les cas plus complexes peuvent toujours tomber sur du Stimulus/PHP, mais l’essentiel se code côté serveur.\nSa présentation étant centrée sur la boutique, Loïc Caillieux a aussi introduit les perspectives côté back-office, que Loïc Frémont allait détailler ensuite. Merci à lui !\nSylius Con 2024 — Le mot de la fin # Cette édition lyonnaise aura été l’occasion de se retrouver nombreux côté AKAWAKA, entre conférences enrichissantes et rencontres de qualité avec les acteurs de l’écosystème.\nMerci à l’équipe Sylius pour l’organisation de cet événement, et à toute la communauté pour ces moments d’échange — qu’il s’agisse des talks ou des discussions plus informelles autour d’un verre.\nLes photos de l’événement sont disponibles sur Google Photos.\nÀ très vite pour la prochaine édition ! 👋\n","date":"27 janvier 2024","externalUrl":null,"permalink":"/sylius-con-2024/","section":"Actualités","summary":"","title":"Sylius Con 2024","type":"posts"},{"content":" Bien reposés de la veille, nous démarrons cette deuxième journée du Forum PHP ! 👉 Vous avez manqué le début ? Retrouvez Le Forum PHP 2024 à Disneyland – Jour 1.\nLoïc Frémont — Créer des UI d’admin avec Symfony UX et Sylius # Sylius Symfony UX Twig Hooks Admin UI Loïc Frémont, contributeur Sylius et collègue (coucou Loïc 👋), a présenté une conférence sur la création d’interfaces d’administration (admin UI).\nSon talk explore l’évolution de l’architecture Sylius et la façon dont elle peut être exploitée pour simplifier le développement d’admin UI, même en dehors du contexte e-commerce.\nUn bref historique : Loïc a commencé par retracer l’histoire de Sylius, en soulignant notamment la refonte du système de grille et l’introduction des “templates génériques” pour standardiser et simplifier la création des pages d’administration. Il a ensuite expliqué comment ces templates ont évolué pour devenir les “Twig Hooks”, un système permettant une customisation avancée de l’interface.\nLa nouveauté La grande nouveauté, c’est l’arrivée de nouveaux packages permettant d’utiliser les composants clés de Sylius (Resource Bundle, Grid Bundle et Twig Hooks) dans n’importe quel projet Symfony. Fini la dépendance au “mono-repo” e-commerce (sylius/core) !\nVous pouvez désormais profiter de Sylius pour gérer vos entités, créer des grilles de données dynamiques et personnaliser votre interface, le tout sans avoir à installer la partie e-commerce de Sylius.\nLes avantages # Rapidité de développement : Créez des interfaces d’administration complètes rapidement. Flexibilité et extensibilité : Customisez chaque aspect de votre interface grâce aux Twig Hooks. Maintenance simplifiée : Profitez d’une architecture claire et modulaire. Intégration Symfony : S’intègre parfaitement avec votre écosystème Symfony existant. Concrètement, ça donne quoi ? # Loïc a illustré ses propos avec un cas d’usage : gérer les speakers et les talks du Forum PHP. Il a montré comment créer des grilles de données, ajouter des filtres, des tris, des images, des liens, et même des champs auto-complétés, le tout avec simplicité.\nEnvie d’en savoir plus ? Ne manquez pas le replay de la conférence de Loïc en décembre ! Vous y découvrirez :\nComment configurer et utiliser les nouveaux packages Sylius. Comment créer des grilles de données dynamiques et interactives. Comment personnaliser votre interface avec les Twig Hooks. Comment exploiter les fonctionnalités avancées de Sylius pour créer des admins UI sur mesure. Support de présentation # Retrouvez ses slides pour plus d’informations !\nNicolas Grekas — Les objets paresseux débarquent en PHP # Lazy objects PHP 8.4 Performance Nicolas Grekas, figure de la communauté Symfony, nous parle des “Objets Paresseux”. Dans cette session, il explore le concept des “lazy objects” et comment les implémenter en PHP 8.4 et Symfony.\nLazy Loading : Optimisation et performance # Nicolas a commencé par décortiquer les différentes stratégies de “lazy loading”, en s’appuyant sur les travaux de Martin Fowler, auteur dans le domaine de l’architecture logicielle. Il a illustré chaque stratégie avec des exemples et du code, démontrant ainsi comment l’initialisation paresseuse peut améliorer les performances de vos applications.\n“On n’appelle les données que si on en a vraiment besoin”\n— Nicolas Grekas\nL’une des idées clés était de retarder l’instanciation d’objets coûteux jusqu’au moment où ils sont réellement nécessaires. Imaginez un objet qui effectue des requêtes en base de données : grâce au lazy loading, on évite de surcharger le système en ne chargeant les données que lorsqu’elles sont sollicitées.\nImplémentations et cas d’usage # La présentation a ensuite exploré différentes implémentations possibles des objets paresseux, notamment avec des techniques de proxy et d’initialisation conditionnelle. Nicolas Grekas a notamment abordé :\nL’intégration avec Symfony, en exploitant le conteneur de services pour instancier les objets au bon moment. L’utilisation de valeurs marqueurs pour déterminer si un objet a déjà été initialisé. Le rôle des closures dans la gestion du lazy loading. Joël Wurtz — Gérer de gros volumes de données avec PHP # Big data RabbitMQ Synchronisation Des défis et des solutions concrètes # Joël Wurtz a illustré ses propos à travers trois cas pratiques rencontrés avec son équipe :\n1 Le traitement de données en temps réel Pour gérer un flux de données provenant de proxies, l’équipe a opté pour une architecture en micro-services et a utilisé RabbitMQ pour gérer les messages. 2 La gestion des modifications de fichiers CSV volumineux Prenant l’exemple d’un vendeur de poulet modifiant constamment son fichier de produits, Joël a expliqué comment ils ont mis en place un système de différentiel en utilisant un moteur en mémoire et en tirant parti de la commande comm. 3 La synchronisation de données entre applications Face à un volume de données à synchroniser, la pagination et le traitement côté client ont été utilisés pour optimiser les appels API et réduire la charge mémoire. Joël Wurtz — Optimiser les performances de votre API avec AutoMapper # AutoMapper API Platform Performance AutoMapper : Un outil pour le mapping d’objets # Joël a commencé par présenter AutoMapper comme un outil permettant de mapper des données entre différentes représentations, notamment entre des objets et des structures génériques comme les tableaux PHP. L’objectif principal d’AutoMapper est d’offrir des performances élevées, ce qui est crucial pour les API modernes.\nCas concret : Amélioration des performances d’API Platform # La présentation s’est appuyée sur un cas concret d’utilisation d’AutoMapper au sein d’une application développée avec API Platform. En remplaçant une partie de la sérialisation par AutoMapper, l’équipe de développement a constaté une augmentation des performances.\nLe résultat Joël a expliqué comment la mise en place d’AutoMapper a permis de réduire la charge sur les serveurs et d’améliorer l’expérience utilisateur globale.\nFonctionnement d’AutoMapper # La conférence a également abordé le fonctionnement interne d’AutoMapper, en expliquant comment l’outil gère les transformations d’objets et les mappings complexes. Joël a illustré ses propos avec des exemples de code et des schémas, permettant aux participants de comprendre les mécanismes sous-jacents.\nIntégration avec Symfony # Un point important soulevé par Joël est l’intégration d’AutoMapper avec Symfony. Il a montré comment AutoMapper peut être facilement intégré dans un projet Symfony et comment il tire parti des fonctionnalités de ce framework pour simplifier le développement.\nGrégoire Pineau — Castor : le task runner PHP qui vous simplifie la vie # Castor Task runner DX Le Forum PHP 2024 a accueilli Grégoire Pineau, de JoliCode et Redirection.io, pour une présentation sur Castor, un task runner PHP conçu pour simplifier le développement. Si vous cherchez une alternative à Makefile, Fabric ou Invoke, ne cherchez plus !\nAutomatisation simplifiée # Grégoire a démontré comment Castor permet d’automatiser les tâches répétitives du quotidien d’un développeur PHP, comme l’installation et la mise à jour des vendors, l’exécution de scripts et de commandes, etc.\n“L’idée c’est que vous n’ayez pas 50 000 classes à écrire. En quelques lignes de code, vous avez réussi à faire ce que vous voulez que ça fasse.”\n— Grégoire Pineau\nDes fonctionnalités clés pour une meilleure DX # Castor met l’accent sur la Developer Experience (DX) en proposant :\nFacilité d’écriture : des tâches définies simplement avec des fonctions PHP. Partage de la connaissance : centralisation des commandes pour une meilleure collaboration au sein d’une équipe. Utilitaires intégrés : fonctions pour interagir avec le système de fichiers, effectuer des requêtes HTTP, gérer des fichiers YAML, etc. Support multiplateforme : Windows, Mac, Linux, et même des binaires statiques pour les environnements sans PHP. Autocomplétion : pour gagner du temps et éviter les erreurs de frappe. Gestion des contextes : pour adapter l’exécution des tâches à différents environnements (dev, prod, etc.). Extensibilité : via un système d’événements et la possibilité d’ajouter des packages. Et bien plus encore…\nGrégoire a également présenté des fonctionnalités avancées comme le repackaging d’applications et la génération de binaires statiques, permettant de déployer des applications basées sur Castor.\nSmaïne Milianni — Le Zero Downtime Deployment en pratique : plus jamais de MEP à 7h du matin ! # Déploiement ZDD Base de données Smaïne Milianni nous a offert une présentation sur le Zero Downtime Deployment (ZDD) lors du Forum PHP 2024. Finis les déploiements nocturnes et les interruptions de service ! Smaïne nous a guidés à travers les principes et les pièges du ZDD, illustrant ses propos par des exemples et des anecdotes.\nPoints clés de la présentation # Le ZDD, une philosophie avant tout : Smaïne insiste sur l’importance d’une approche où chaque changement est pensé en termes de compatibilité ascendante et de déploiement progressif. Gestion des schémas de base de données : Modifier une base de données en production sans interruption de service ? C’est possible ! Smaïne nous a montré comment procéder étape par étape, en ajoutant des colonnes, modifiant des contraintes, etc. Messages asynchrones et contrats d’API : Le ZDD s’applique aussi aux architectures asynchrones. Smaïne a partagé des techniques pour faire évoluer les messages et les API sans perturber les consommateurs. Outils et bonnes pratiques : De la librairie “ZDD Compliant” aux tests automatisés, Smaïne a présenté les outils qu’il a développés pour faciliter la mise en place du ZDD. “Développer, c’est facile. Le plus compliqué, c’est de réfléchir à la manière de déployer son code sans interruption de service.”\n— Smaïne Milianni\nForum PHP 2024 — Le mot de la fin # Voilà, le Forum PHP 2024 est déjà terminé !\nRendez-vous sur la chaîne YouTube de l’AFUP pour visionner les replays de ces présentations dès décembre !\nUn grand merci à tous les participants, speakers, sponsors et bénévoles qui ont fait de cet événement un moment agréable.\nOn se retrouve l’année prochaine pour une nouvelle édition !\nÀ très vite ! 👋\nUne interface d’administration sur mesure avec Sylius ? Resource Bundle, Grid Bundle, Twig Hooks : nos experts Sylius conçoivent des back-offices robustes et évolutifs, e-commerce ou non. Découvrir notre expertise Sylius ","date":"18 janvier 2024","externalUrl":null,"permalink":"/le-forum-php-2024-a-disneyland-jour-2/","section":"Actualités","summary":"","title":"Le Forum PHP 2024 à Disneyland – Jour 2 !","type":"posts"},{"content":" Le Forum PHP 2024 s’est tenu cette année dans un cadre aussi insolite qu’inspirant : Disneyland Paris. L’équipe AKAWAKA était sur place pour cette première journée riche en conférences techniques, échanges entre experts PHP et retours d’expérience terrain. On vous partage ici nos temps forts, nos coups de cœur et ce qu’on retient de cette édition incontournable pour la communauté PHP. Alexandre Daubois — Create your own malware sandbox # Sécurité Upload de fichiers Sandbox Alexandre Daubois a présenté une approche pour sécuriser le téléchargement de fichiers dans le cadre d’un pentest. Face à l’exigence d’une meilleure sécurité, trois options s’offraient à lui : abandonner (impossible pour le client), utiliser une sandbox existante, ou créer sa propre solution.\nAprès avoir écarté l’option de l’antivirus maison (trop complexe et source de faux positifs/négatifs), Alexandre a opté pour une sandbox maison, plus adaptée au contexte d’un back-office interne, authentifié et privé.\nSa solution repose sur plusieurs étapes clés :\n1 Création d’un répertoire de sandbox 2 Logging et réinitialisation de la sandbox 3 Vérification des caractères interdits dans le nom du fichier 4 Lecture du fichier et suppression des droits d’exécution 5 Analyse des “magic bytes” Pour identifier le type de fichier et bloquer les exécutables. 6 Gestion spécifique des archives Pour éviter les attaques de type “tar bomb” ou “récursion infinie”. Le résultat Le résultat : une sandbox efficace, développée avec moins de 10 classes PHP !\nForum PHP 2024 – Create your own malware sandbox Kévin Dunglas — Comment déboguer Xdebug # Xdebug FrankenPHP gdb Kévin Dunglas a partagé un retour d’expérience sur une situation de débogage complexe rencontrée lors du développement de FrankenPHP, son serveur PHP haute performance.\nConfronté à un bug difficile à reproduire, Kévin a dû identifier la source du problème. Xdebug, l’outil de débogage en PHP, était mis en cause, ce qui a compliqué l’investigation.\nAprès avoir obtenu un exemple reproductible grâce à la communauté, Kévin a utilisé le GNU Debugger (gdb) pour analyser le comportement de Xdebug au niveau du code C. Il a ainsi pu identifier une récursion infinie causée par un problème de compatibilité avec les builds ZTS (Zend Thread Safety).\nLes leçons Ce retour d’expérience nous rappelle l’importance :\nde la contribution à la communauté open source de la communication et du partage d’informations de l’utilisation des bons outils de débogage de la persévérance et de la rigueur dans l’analyse des problèmes Nicolas Grekas — What’s new in Symfony 7.x # Symfony 7 Nouveautés Nicolas Grekas a présenté les nouveautés de Symfony 7.x, mettant en avant l’ampleur du travail accompli avec 33 000 lignes de code ajoutées et 14 000 lignes supprimées. Parmi les nouvelles fonctionnalités et améliorations :\nHTML sanitizer Clock RemoteEvent et Webhook Scheduler AssetMapper D’autres composants sont en cours de développement, notamment :\nObjectMapper JsonEncoder FeatureFlag AccessToken Symfony 7.x apporte également des améliorations en termes d’expérience développeur, de performances et d’utilisation de PHP. Pour une vue d’ensemble complète, consultez la newsletter Symfony ou les articles de blog dédiés aux nouvelles versions. Symfony a également publié un résumé des nouveautés sur son site web.\nDerick Rethans — Les nouveautés de PHP 8.4 # PHP 8.4 Nouveautés Derick Rethans, créateur de Xdebug et contributeur majeur de PHP, a présenté les nouveautés de PHP 8.4. Parmi les points importants :\nLe langage # Property hooks : Définition de getters et setters locaux aux propriétés, pour un code plus propre et plus concis. Visibilité asymétrique : Contrôle plus fin de l’accès en lecture et en écriture aux propriétés des classes. new sans parenthèses : Amélioration syntaxique pour l’instanciation d’objets. Lazy objects : Optimisation des performances grâce au chargement différé des dépendances. Dépréciation du type null implicite : Amélioration de la rigueur du typage. Amélioration de l’attribut Deprecated : Ajout de l’argument since pour indiquer la version de PHP à partir de laquelle un élément est déprécié. Les extensions et le moteur # Parsing HTML5 : Meilleure prise en charge du HTML5 avec la classe \\Dom\\HTMLDocument. JIT amélioré et documenté : Activation simplifiée et documentation plus complète du compilateur Just-In-Time. Subclasses de PDO : Amélioration de l’API PDO avec des sous-classes spécifiques aux bases de données (PDOMySQL, PDOFirebird, etc.). Nouveaux modes d’arrondi : Extension des fonctions d’arrondi avec de nouvelles options. Augmentation du facteur de coût bcrypt par défaut : Renforcement de la sécurité des mots de passe hachés. Le projet PHP # RFC policies : Publication en ligne des politiques et procédures relatives aux RFC PHP. Changement du cycle de release : Prolongation du support de sécurité à 4 ans (2 ans de maintenance active + 2 ans de corrections de sécurité). Benoit Viguier — Le cycle de vie d’une variable # Mémoire Garbage collector Benoit Viguier a abordé le sujet de la gestion de la mémoire en PHP, en mettant l’accent sur les pièges à éviter et les outils à connaître pour optimiser nos programmes.\nIl a notamment évoqué la controverse suscitée par l’utilisation de la fonction gc_disable() par Composer, justifiée dans le cas de longs scripts en console pour éviter des problèmes de performance avec le garbage collector de PHP.\nPour optimiser la gestion de la mémoire, Benoit a présenté deux classes natives :\nWeakReference : permet de créer des objets sans incrémenter le nombre de références à une variable, évitant ainsi les fuites de mémoire dues aux références circulaires. WeakMap : permet de stocker des références à des objets sans contribuer à leur comptage de références, facilitant ainsi la libération de la mémoire. Pour aller plus loin Pour explorer encore davantage le sujet, Benoit recommande de visionner la conférence suivante : Hunting down memory leaks – Benoit Jacquemont.\nAntoine Bluchet — PMU : un plugin Composer pour la gestion de monorepos en PHP # Monorepo Composer PMU Antoine Bluchet a présenté PMU, un plugin Composer qu’il a développé pour faciliter la gestion des monorepos en PHP. Il a débuté sa présentation en expliquant le concept de monorepo : un dépôt unique contenant plusieurs projets liés, contrairement aux polyrepos où chaque projet possède son propre dépôt.\nAvantages du monorepo # Meilleure visibilité des projets et de leurs dépendances Simplification du partage de code entre projets Cohérence des versions de dépendances et des outils Efficacité accrue de l’intégration continue et du déploiement continu Inconvénients du monorepo # Complexité accrue de la gestion, notamment pour les gros projets Impact potentiel sur les performances du système de contrôle de version Outils pour gérer les monorepos en PHP # Symfony Flex splitsh-lite symplify/monorepo-builder alexander-schranz/mono PMU : le plugin Composer développé par Antoine, offrant des fonctionnalités de gestion des dépendances, de visualisation du graphe de dépendances, d’exécution de commandes sur plusieurs projets et de création de liens symboliques. Monorepo ou polyrepo ? Le choix entre monorepo et polyrepo dépend du contexte et des besoins de chaque projet. PMU se présente comme une solution pour faciliter la gestion des monorepos en PHP.\nMatthias Noback — Éliminer le gaspillage dans votre processus de développement # Productivité Mob programming Lean Cette conférence de Matthias Noback a offert une perspective sur l’optimisation des processus de développement pour une meilleure productivité et une livraison de valeur plus rapide.\nL’accent a été mis sur la performance collective, remettant en question le mythe du “programmeur 10x” et soulignant l’importance de la collaboration, du partage des connaissances et de l’amélioration continue en équipe.\nCoder ensemble, c’est coder mieux ! # La programmation en binôme ou à plusieurs (“mob programming”) a été présentée comme une technique pour améliorer la qualité du code et la prise de décision. L’idée est de coder à plusieurs, avec un pilote au clavier et des navigateurs qui guident et réfléchissent ensemble.\nFluidifiez votre “chaîne de valeur” # L’analyse de la “chaîne de valeur” permet d’identifier les points de blocage et les sources de gaspillage dans le processus de développement (branches stagnantes, features non déployées, process de review interminables, etc.).\nDes conseils ont été donnés pour fluidifier le processus : automatisation des tests, suppression des étapes inutiles, découpage des tâches, et utilisation de la méthode Mikado pour le refactoring.\nÀ retenir Simplifier, automatiser et collaborer sont les maîtres-mots pour un développement efficace et une livraison de valeur rapide et sécurisée.\nForum PHP 2024 — Conclusion de la journée # Après ces conférences, nous avons pu nous rendre à l’apéro communautaire organisé par l’AFUP avec encore une fois un jeu qui encourageait à aller à la rencontre des uns et des autres.\n👉 La suite de nos retours : Le Forum PHP 2024 à Disneyland – Jour 2.\nPréparer votre application à Symfony 7 et PHP 8.4 ? Montées de version, performance, sécurité : nos experts Symfony vous accompagnent pour tirer parti des dernières versions de PHP et du framework. Découvrir notre expertise Symfony ","date":"17 janvier 2024","externalUrl":null,"permalink":"/le-forum-php-2024-a-disneyland-jour-1/","section":"Actualités","summary":"","title":"Le Forum PHP 2024 à Disneyland – Jour 1 !","type":"posts"},{"content":" L’édition 2024 de l’API Platform Conference nous a embarqué·e·s au cœur de l’écosystème API Platform pendant deux journées denses à Lille. Entre keynotes, retours d’expérience, deep dives techniques et table ronde, l’équipe AKAWAKA a capté les tendances et les bonnes idées à ramener dans vos projets. Voici notre sélection des talks les plus marquants. Matthieu Werner — L’IA au service de vos projets API Platform # IA Productivité Outils Matthieu Werner déroule un cas pratique : construire un site de projet de bout en bout avec de l’IA, du cadrage au déploiement. Après un rappel sur l’évolution de l’IA et son adoption en entreprise, il enchaîne les étapes d’un projet typique en montrant où brancher quel outil.\n1 Cadrage fonctionnel ChatGPT pour générer une liste de fonctionnalités, puis Notion AI pour organiser le backlog et un tableau Kanban. 2 Architecture \u0026amp; design Lucidchart pour les schémas d’architecture, Figma AI pour l’aspect graphique. 3 API ChatGPT pour générer le schéma OpenAPI, puis un générateur d’API à partir du schéma. React Admin (compatible API Platform) pour l’admin. 4 Code \u0026amp; tests GitHub Copilot et Cursor comme assistants de code, génération de tests depuis les fichiers sources, et GitHub Actions boostées à l’IA pour la CI. À retenir L’IA fait gagner un temps considérable sur les tâches récurrentes, mais : outils souvent payants, risque de réponses incorrectes, et complexité de gestion quand on empile les services. À utiliser avec discernement.\nSergès Goma — How dev became villains # Éthique Responsabilité Soft skills Après un ice breaker mémorable sur nos evil laughs, Sergès Goma pose une question dérangeante : les développeur·se·s sont-ils devenus des villains ? L’IA aux comportements biaisés (racisme, sexisme), les affaires FTX, Telegram… autant d’exemples que le code peut servir à des fins malveillantes.\nQui sont vraiment les stakeholders du logiciel ? # Les end users Les gouvernements Les organisations et clients Les développeur·se·s eux-mêmes Les 3rd parties Nous avons une responsabilité collective dans ce que nous construisons et dans l’impact sur la société.\nNote d’humour (et de lucidité) Démissionner pour refuser une mission problématique… n’est pas toujours une option. D’où l’importance de se poser la question avant d’accepter.\nAllison Guilhem — Gestion des messages et notifications en temps réel avec API Platform # Temps réel Mercure SSE FrankenPHP Allison Guilhem décortique le temps réel avec API Platform, en partant du socle HTTP :\nHTTP/1.1 introduit les connexions persistantes. HTTP/2 apporte binaire, multiplexing et server push. HTTP/3 contourne les limites de TCP via UDP (QUIC) avec un chiffrement natif. Les techniques de communication temps réel # Polling / Long Polling : simple et universel, pas de connexion persistante nécessaire. Server-Sent Events (SSE) : facile à mettre en œuvre, basé sur HTTP, reconnexion auto, unidirectionnel. WebSocket : bidirectionnel, faible latence, binaire ou texte — mais plus complexe, moins bien aligné avec HTTP/2/3, et comporte des défis de scalabilité et de sécurité. La solution : Mercure # Mercure, créé par Kévin Dunglas, s’appuie sur SSE et coche toutes les cases : reconnexion/synchronisation automatiques, sécurisation par JWT, haute performance, compatibilité GraphQL et hypermédias, chiffrement intégré.\nAllison illustre le tout avec un casino en ligne : détection d’actions interdites (fraude, connexions depuis des pays restreints), notifications instantanées sur un dashboard admin. L’intégration avec FrankenPHP se fait en installant MercureBundle, en configurant les ressources API Platform et en déclenchant les updates sur les endpoints.\nLe temps réel, pas juste un gadget Au-delà de l’UX, le temps réel transforme la manière dont on interagit avec la donnée elle-même : plus seulement la consulter, mais y réagir à l’instant.\nMathias Arlaud — Accélérer la sérialisation avec API Platform # Sérialisation TypeInfo JsonEncoder Performance « Représenter des structures de données dans un format pouvant être envoyé ou persisté, afin d’être reconstruit plus tard. »\nMathias Arlaud rappelle qu’en API, chaque requête passe par un entonnoir : Provider → Processor → (dé)sérialisation. Comme API Platform s’appuie sur le Serializer Symfony, on hérite de ses performances… et de ses limites.\nLe principe : \u0026ldquo;Metadata is data, but about data\u0026rdquo; # Plus on en sait sur la donnée, plus on peut l’exploiter efficacement. Avec une classe Rain typée via PHPDoc génériques :\nRain.php/** @template T of string */ final class Rain { /** @return list\u0026lt;T\u0026gt; */ public function content(): array {} } /** @var Rain\u0026lt;\u0026#39;cat\u0026#39;|\u0026#39;dog\u0026#39;\u0026gt; $englishRain */ $englishRain = new Rain(); Problème : le PropertyTypeExtractor historique de Symfony ne gère ni unions, intersections, listes/dictionnaires, ni génériques. D’où le nouveau composant TypeInfo, qui lit propriétés, retours de méthode et PHPDoc en finesse.\nJsonEncoder + streaming # À cela s’ajoute un JsonEncoder qui s’appuie sur TypeInfo et sur le streaming : au lieu de tout charger en mémoire, chaque élément est écrit progressivement, créant un encoder optimisé à la volée.\nCat.phpfinal class Cat { public string $name; public bool $flying; } cat.json{ \u0026#34;name\u0026#34;: \u0026#34;Mittens\u0026#34;, \u0026#34;flying\u0026#34;: false } Une ressource = une représentation # Les #[Groups] permettent de projeter plusieurs vues sur la même ressource, mais multiplient les combinaisons. API Platform pousse plutôt vers une ressource dédiée par contexte (CatGet, CatPost), avec le composant ObjectMapper et les attributs #[Map] pour factoriser les transformations sans boilerplate.\nLes gains annoncés Jusqu’à ×40 sur l’encodage via le nouveau JsonEncoder, ×20 côté ObjectMapper, et ×10 en désérialisation. Certains composants (TypeInfo, ObjectMapper) ne sont pas encore stabilisés mais la direction est claire.\nFrançois Zaninotto — API Platform Admin: The Ultimate Admin Generator # Admin React Admin No-code François Zaninotto (créateur de react-admin, 25k★) démonte en live quatre promesses du générateur d’admin API Platform :\n1 CRUD facile, sans code Une entité, quelques attributs, et le CRUD apparaît dans l’admin. Point. 2 Zéro code JavaScript Avec #[ApiFilter] et quelques IRI dans le schéma, l’admin se met à jour tout seul — doc comprise. Avec Mercure, les changements sont même diffusés en live à tous les utilisateurs connectés. 3 Étendre via une API JS simple Pas moyen de choisir les champs via PHP uniquement. Le code généré est dumpé dans la console avec des instructions pour l’override. On modifie le composant, on ajuste props/labels/tri, et c’est en place. 4 Remplacer n’importe quelle partie par un composant React custom On délaisse FieldGuesser/ListGuesser/EditGuesser pour les composants explicites (List, Datagrid, Edit…). Plus de guess, plus de contrôle. La richesse de react-admin # François met en avant des composants prêts à l’emploi : PrevNextButton, TranslatableInputs, MenuLive (badges temps réel), FilterList, RevisionsButton, WizardForm multi-étapes, et même des calendriers.\nPourquoi react-admin ? Un ancêtre existait déjà pour Symfony 1 (ng-admin + Bootstrap), avec les limites du YAML et du JS verbeux. React-admin bascule en headless et laisse choisir la librairie UI (shadcn, Tailwind, etc.) — quelqu’un en a même tiré un clone Spotify.\nFrédéric Bouchery — Adopter un lapin (RabbitMQ) # RabbitMQ Messenger Asynchrone Frédéric Bouchery partage son REX sur RabbitMQ avec API Platform. Il commence par les fondamentaux : création des queues, cycle de vie des messages, stratégies ack/nack, et un rappel important : ne jamais présumer que les messages seront consommés dans l’ordre.\nDeux idées fausses à corriger # On ne publie pas directement dans une queue, mais sur un échangeur qui route vers les bonnes queues (potentiellement avec des tags/filtres). Trop souvent, RabbitMQ est utilisé comme un simple Symfony Messenger : un échangeur, une queue, un consommateur. Dommage, il est conçu pour du parallélisme bien plus riche. L’intégrer dans API Platform # Installer Symfony Messenger et le transport RabbitMQ. Déclarer messenger dans l’attribut d’opération API Platform pour router l’appel vers un message. Problème : la réponse est vide. Solution : décorer le PersistProcessor pour persister ET envoyer le message, en conservant la réponse de l’endpoint. Pour les messages eux-mêmes : MessageSerializer custom ou — mieux — DTO partagés entre producteur et consommateur plutôt que des entités Doctrine. Table ronde — Le marché de l’emploi # Emploi Salaires Freelance Avec Clément Talleu, Jeanne Londiche et Olivier Mansour, discussion franche sur l’état du marché.\nLes constats # Freelances : marché tendu, de plus en plus de retours vers le CDI. Beaucoup de jeunes diplômés étaient partis trop vite en freelance, séduits par les TJM. Post-COVID : e-commerce et divertissement avaient explosé — repli marqué aujourd’hui. Salaires : stagnation pour les juniors et confirmés (baromètre AFUP). Attractivité : Les-Tilleuls.coop paye en-dessous du marché mais attire grâce à son modèle coopératif. Télétravail et semaine de 4 jours restent des arguments forts. Langages : PHP est moins recherché seul ; les entreprises veulent des profils polyvalents. Pour se démarquer en tant que dév Veille technologique et projets perso, oui — mais sur son temps pro idéalement. Les entreprises devraient proposer du mentorat pour les juniors plutôt que de compter sur le temps libre.\nSmaïne Milianni — Comment se sortir du legacy ? # Legacy Clean Code Refactoring Tests Smaïne Milianni propose une feuille de route claire pour s’attaquer au code legacy — qu’il s’agisse de vieux code, de code sans tests, ou de code qui rapporte mais qu’on n’ose plus toucher.\nLes caractéristiques d’un bon test (FIRST) # Rapide : exécution éclair. Isolé : pas d’interférence entre tests. Répétable : local = CI. Auto-validant : succès/échec évident. Exhaustif : scénarios couverts largement. Les outils # Deptrac pour visualiser et contraindre les dépendances entre modules. Rector pour automatiser le refactoring via règles. Les principes à (re)garder en tête # “Make it work, then make it clean.” KISS, SOLID, DRY Design patterns uniquement quand c’est vraiment nécessaire (Strategy, Adapter, Decorator…). Architectures : Clean, Hexagonal, Onion, CQRS, MVC — à choisir selon le besoin. Fin du “Array Oriented Programming” : DTO partout ! (SQL, HTTP, commandes…). Boy Scout rule : laisser le code dans un meilleur état que celui trouvé. Dépendances à jour (via Renovate ou manuel régulier). Les pièges à éviter sur un projet legacy # Ne modifiez jamais du code sans le comprendre. Ne changez pas plusieurs choses en même temps. Ne travaillez jamais seul·e sur du legacy. Ne réécrivez pas intégralement sans tests. Attaquez les opérations de lecture avant les écritures (moins risqué). Stratégies éprouvées # Mikado Method : découper un gros refactoring en petites étapes. Golden Master Testing : capturer le comportement actuel pour le comparer après refactoring. Smoke Tests : vérifier que l’essentiel tient debout après chaque étape. Le code ne vous appartient pas Il appartient à l’équipe et aux futures générations qui devront le maintenir. Chaque modification doit être validée collectivement.\nCôté management # Auditer, documenter, planifier, tester, avancer par petits pas, communiquer, déployer, monitorer… et recommencer. Le refactoring est un processus continu, pas un projet one-shot.\nBoas Falke — Automating builds with FrankenPHP # FrankenPHP Caddy Binaire statique CI/CD Boas Falke présente FrankenPHP comme un service unique pour exécuter PHP — en prod, en CI, en dev.\nLes atouts # Homogénéité Prod / CI / Dev. Caddy custom, avec des fonctionnalités additionnelles embarquées. Mode worker pour les performances. Support des HTTP 103 Early Hints. Distribution sous forme de binaire statique, sans dépendances externes. Construire son binaire statique # 1 Base : image static builder Partir de l’image static-builder officielle. 2 Préparer les sources Archiver les fichiers nécessaires, définir les variables d’environnement, supprimer les dossiers inutiles (tests…). 3 Dépendances et env Installer les dépendances requises et exécuter dump-env prod. 4 Build Préciser l’emplacement de l’app, les extensions PHP voulues, puis lancer le script .sh de build. 5 Artifact Pousser le binaire comme artifact GitLab (ou autre CI/CD). Démo live avec Mailpit # Démo bluffante : un fichier est déposé → le binaire déclenche un envoi d’email capturé par Mailpit. Preuve que le binaire interagit nativement avec le système de fichiers et les tâches programmées.\nLa promesse Un seul binaire, zéro dépendance externe, performances au rendez-vous : FrankenPHP simplifie radicalement la distribution d’apps PHP.\nAPI Platform Conference 2024 — Le mot de la fin # L’API Platform Conference 2024 a une nouvelle fois tenu toutes ses promesses. Les conférences étaient de qualité, la table ronde s’est révélée passionnante et a suscité des échanges enrichissants. Comme toujours, l’organisation était irréprochable, permettant de profiter pleinement de chaque moment. Sans oublier l’excellent apéro, propice à prolonger les discussions dans une ambiance chaleureuse et détendue.\nUne édition à la hauteur des attentes, vivement la prochaine !\nÀ très vite ! 👋\nUn projet API Platform à lancer, migrer ou accélérer ? Temps réel avec Mercure, sérialisation performante, sortie du legacy, FrankenPHP : nos experts Symfony vous accompagnent sur vos API. Découvrir notre expertise Symfony ","date":"26 janvier 2024","externalUrl":null,"permalink":"/lapi-platform-conference-2024-a-lille/","section":"Actualités","summary":"","title":"L’API Platform Conference 2024 à Lille","type":"posts"},{"content":" La conférence C3 Fest est un événement unique qui fusionne des conférences techniques avec des expressions artistiques visuelles et sonores, toutes en lien avec le numérique. Tenu à Amsterdam, cet événement contemporain rassemble des experts en ingénierie logicielle et en design pour explorer les intersections entre la technologie, la carrière et la créativité.\nDans cet article, nous allons explorer les conférences retenues par l’équipe AKAWAKA.\nJohn Romero — What AI Can, Can’t, and Shouldn’t Do for Games # IA Jeu vidéo Game design John Romero, légendaire concepteur de jeux vidéo et co-créateur du célèbre jeu DOOM, a exploré l’évolution de l’IA dans les jeux vidéo, notamment l’émergence des IA génératives et leur potentiel à remplacer certains métiers créatifs. Actuellement, environ 50 % des professionnels du jeu vidéo utilisent l’IA.\nRomero a aussi envisagé des améliorations futures possibles grâce à l’IA, telles que :\nArbres de décision pour les jeux RTS Arbres de comportement pour les FPS IA basée sur l’utilité des NPC dans les RPG/MMORPG Comportements de guidage pour des mouvements réalistes dans les jeux de sport automobile Apprentissage machine pour les jeux de société Génération procédurale pour les mondes ouverts comme Minecraft IA scriptée pour les jeux narratifs La limite de l’IA Cependant, l’IA ne peut pas inventer de nouveaux concepts de game design. Par exemple, DOOM a révolutionné le jeu vidéo en innovant sur de nombreux aspects, chose que l’IA ne peut pas accomplir actuellement.\nUna Kravets — Less Cruft, More Power: Leverage the Power of the Web Platform # CSS HTML Amélioration progressive Una Kravets, de Google, a mis en avant la puissance croissante des technologies web, notamment HTML et CSS. Elle a illustré comment CSS devient de plus en plus puissant, par exemple avec la nouvelle API d’animations au scroll qui permet de créer des interfaces dynamiques sans JavaScript, favorisant l’amélioration progressive. Pour plus de détails sur les animations au scroll, vous pouvez consulter la documentation sur MDN.\nElle a détaillé les avantages des nouveaux attributs CSS, réduisant les dépendances JavaScript et améliorant les performances, comme les animations contrôlées par le défilement et les nouveaux attributs HTML tels que popover/dialogs, permettant de créer des modals et des menus déroulants en HTML natif sans JavaScript, ajoutant également du sens sémantique.\nEffet wahou En conclusion, elle a démontré toutes ces fonctionnalités en utilisant uniquement HTML et CSS pour ses slides, sans recourir à JavaScript, ajoutant un effet “wahou” à sa présentation.\nPour en savoir plus sur les nouveaux attributs HTML et CSS, vous pouvez consulter la documentation sur MDN pour les popovers.\nGoran Vuksic — The Force of Engineering: Bringing Your Own Star Wars Sidekick to Life # Robotique Raspberry Pi Azure Vision Goran Vuksic a présenté comment il a reconstruit un Pit Droid de l’univers Star Wars. Partant d’un modèle 3D utilisé pour le film, il a imprimé en 3D chaque partie du robot, les a peintes et assemblées. Le robot est équipé d’un Raspberry Pi connecté à une carte Nvidia Jetson Orin Nano pour l’IA. Il a montré du code Python pour gérer les moteurs et les LEDs via le port GPIO du Raspberry Pi. Le robot utilise une webcam et le service Vision d’Azure pour analyser les images et reconnaître jusqu’à 10 000 concepts et objets.\nEn conclusion, Goran Vuksic a démontré que, grâce à l’impression 3D et à des composants accessibles comme le Raspberry Pi et les services d’Azure, il est possible de recréer des objets sophistiqués issus de l’univers de la science-fiction avec des capacités d’intelligence artificielle et de vision avancées.\nChristian Heilmann — 35 Years of WWW: Working as a Content Creator, Designer and Developer With the Coolest Medium Ever # Web Carrière Rétrospective Christian Heilmann a offert une rétrospective de sa carrière, depuis le hacking de vieux jeux PC, les débuts de l’internet, l’apparition de JavaScript et des premiers smartphones. Voici les points clés de sa présentation :\nCe qui fonctionne : Analyser, corriger et optimiser le code est plus important que de l’écrire. Les solutions ingénieuses peuvent vous rendre célèbre, mais peuvent être préjudiciables à long terme. Ce qui ne fonctionne pas : Les plateformes fermées évoluent rapidement mais disparaissent prématurément. Améliorer le web actuel par des correctifs plutôt que par des contributions constructives. Promouvoir des produits précipités comme entièrement fonctionnels. En conclusion, Christian Heilmann souligne l’importance de bonnes pratiques de développement et de la contribution positive à l’écosystème web.\nBassem Dghaidi — Adapting to the Future of Work in Tech # Futur du travail IA SaaS Bassem Dghaidi a commencé par une rétrospective de l’informatique, depuis les premières recherches en 1936 jusqu’à aujourd’hui, en passant par l’évolution des langages de programmation et de l’architecture logicielle. Il a conclu que l’innovation en informatique est passée d’une courbe exponentielle à une courbe linéaire.\nIl a souligné que les systèmes actuels demandent une connaissance approfondie pour gérer leur complexité. Concernant l’IA, il a précisé que son but n’est pas de remplacer mais de compléter.\nPour se préparer à l’avenir (Software 2.0), il affirme que le modèle SaaS est en déclin. Cependant, il est important de noter que bien que certaines formes de SaaS puissent évoluer ou diminuer, le modèle SaaS en général continue d’être pertinent et largement utilisé dans de nombreuses industries.\nEn conclusion, Bassem Dghaidi a insisté sur la nécessité de s’adapter aux évolutions technologiques et de se préparer à un avenir où la complexité et l’interconnexion des systèmes exigent une expertise et une agilité accrues.\nC3 Fest — Le mot de la fin # Le C3 Fest ne s’est pas limité aux conférences techniques ; il a également offert une multitude de présentations sur des aspects plus créatifs et le développement de carrière. Des experts de divers domaines ont partagé leurs idées novatrices et leurs parcours inspirants, offrant aux participants une vision holistique de l’industrie technologique. La journée s’est terminée en beauté avec des concerts de plusieurs artistes qui ont délivré des performances impressionnantes de live coding, mêlant musique et programmation pour une expérience sonore et visuelle.\nPour AKAWAKA, ce fut une expérience exceptionnelle, magnifiée par le cadre enchanteur d’Amsterdam, ajoutant une dimension culturelle et esthétique à cet événement déjà riche en découvertes.\nDes interfaces web modernes, performantes et durables ? HTML et CSS natifs, amélioration progressive, applications web : nos équipes conçoivent des interfaces au plus près des standards du Web. Découvrir notre offre de développement ","date":"24 janvier 2024","externalUrl":null,"permalink":"/c3-fest-a-amsterdam/","section":"Actualités","summary":"","title":"C3 Fest à Amsterdam","type":"posts"},{"content":"","date":"24 janvier 2024","externalUrl":null,"permalink":"/tags/html/","section":"Tags","summary":"","title":"HTML","type":"tags"},{"content":"","date":"24 janvier 2024","externalUrl":null,"permalink":"/tags/ia/","section":"Tags","summary":"","title":"IA","type":"tags"},{"content":"","date":"26 janvier 2024","externalUrl":null,"permalink":"/tags/js/","section":"Tags","summary":"","title":"JS","type":"tags"},{"content":" Les 22 et 23 avril derniers à Paris, AKAWAKA a fait ses premiers pas dans l’univers des conférences 100 % dédiées à l’écosystème JavaScript en participant à React Connection et React Native Connection. Pour AKAWAKA, cette immersion représentait une opportunité de mieux connaître le monde React. Dans cet article, nous allons résumer les moments forts de ces conférences, sélectionnés par l’équipe. Nous vous résumons les présentations les plus inspirantes, les démonstrations les plus captivantes et les discussions les plus pertinentes, offrant ainsi un aperçu des tendances émergentes et des avancées technologiques les plus prometteuses de l’écosystème React.\nRachel Nabors — How we made the new React site # React Connection Documentation Rachel Nabors nous emmène dans les coulisses de la refonte de la documentation de React et React Native. Elle partage son expérience dans l’ajout de fonctionnalités essentielles en réponse aux besoins de la communauté, qui auparavant consultait rarement la documentation.\nLa nouvelle documentation est enrichie de nombreux schémas, de descriptions détaillées des composants et d’exemples interactifs. Un aspect notable est l’utilisation de personnages accessibles à tous, tels que des scientifiques, plutôt que des références à la culture pop américaine.\nLe résultat Grâce à cette refonte, la communauté recommande désormais la nouvelle documentation trois fois plus souvent qu’auparavant.\nMark Erikson — Why You Should Use Redux in 2024 # React Connection Redux State management Mark Erikson, le créateur de Redux, nous éclaire sur les raisons pour lesquelles Redux demeure une solution pertinente en 2024, tout en soulignant les cas d’utilisation idéaux pour cet outil.\nIl met en lumière le fait que Redux n’a jamais bénéficié d’une promotion officielle, ce qui a souvent conduit à des utilisations inappropriées et à une mauvaise réputation. La critique principale portait sur la quantité de code et de fichiers nécessaires à son utilisation.\nMark revient sur la genèse de Redux en 2013, lorsque Facebook a introduit une architecture de flux pour gérer les changements d’état dans les applications. Redux est né de cette époque et est rapidement devenu la solution de prédilection de la communauté, intégrée par défaut dans de nombreuses applications React.\nAujourd’hui, l’objectif est de redéfinir le rôle de Redux. Initialement conçu pour les projets de grande envergure, son architecture a été modernisée en 2023 pour fournir un toolkit adaptable aux évolutions de React, notamment avec React Query, permettant la récupération de données de manière efficace.\nÀ retenir En conclusion, Mark énumère les scénarios dans lesquels l’utilisation de Redux est pertinente, ainsi que ceux où d’autres approches peuvent être préférables.\nSara Vieira — Creating 3D Experiences with React # React Connection 3D Three.js Live coding Sara Vieira nous livre une démonstration épatante de live coding, nous plongeant dans une expérience 3D immersive rappelant l’esthétique rétro de la PlayStation 1, où la jaquette du jeu prend vie sous la forme d’un modèle 3D en rotation.\nPour réaliser cette prouesse, Sara utilise une combinaison de technologies : Blender pour la modélisation 3D, Suzanne pour l’intégration du modèle dans le code, et React avec Three.js pour le rendu 3D.\nCette démonstration met en lumière les possibilités incroyables offertes par ce type d’expérience 3D.\nJean-François Greffier — Vite et bien : React component testing with Playwright # React Connection Tests Playwright Vite Au cours de cette session, Jean-François Greffier nous initie à l’utilisation de Playwright, un outil de test poussé par Microsoft et inspiré de Puppeteer. À travers une démonstration en live coding, il met en lumière les possibilités offertes par cet outil.\nLa syntaxe de Playwright reste familière pour ceux qui sont habitués au testing en JavaScript avec des frameworks comme Jest. L’utilisation de Vite en interne offre des performances remarquables, permettant de regrouper les tests et de les exécuter efficacement.\nEncore jeune Bien que toujours en phase bêta, Playwright présente un potentiel prometteur. Cependant, il est à noter qu’il reste encore des améliorations à apporter avant qu’il puisse être largement adopté.\nMo Khazali — Building complex UIs with a Server-driven React app # React Connection Server-Driven UI Architecture Mo Khazali nous éclaire sur le concept de l’interface pilotée par le serveur, qui permet au backend de contrôler l’affichage des éléments frontend, y compris leur ordre, leur visibilité et d’autres attributs.\nEn pratique, cela se traduit par la fourniture par le backend d’un JSON décrivant les composants à afficher ainsi que leurs paramètres, que le frontend interprète ensuite pour générer l’interface utilisateur.\nCette approche est adoptée par des entreprises telles qu’Airbnb, Lyft et Shopify, offrant la flexibilité d’adapter l’interface en fonction de divers critères, tels que l’état de connexion du client ou son profil utilisateur, par exemple dans le cadre d’une application GPS où les conducteurs de scooters et de vélos voient des interfaces différentes.\nLes limites Cependant, cette solution ne résout pas tous les problèmes : elle déplace la complexité de la logique frontend vers le backend, soulevant des questions sur la mise en cache et la disponibilité hors ligne de l’application. De plus, la gestion de réponses serveur de plus en plus volumineuses pose également des défis.\nCette approche n’est pas universelle et doit être envisagée avec discernement en fonction des exigences spécifiques de chaque projet.\nMaël Nison — Custom Renderers # React Connection Réconciliation Renderers Maël Nison commence par une explication du fonctionnement de la mise à jour du DOM dans React, en mettant en lumière le concept de réconciliation des nœuds JSX. Il plonge ensuite dans les rouages internes du rendu des composants React, en détaillant leur mécanique interne.\nIl approfondit le sujet en présentant un exemple de Rendu Personnalisé pour sa bibliothèque Terminosaurus, permettant de créer des interfaces dans le terminal. Il souligne également d’autres exemples de Rendus Personnalisés tels que React Native, React PDF, etc.\nEn conclusion, il nous oriente vers le dépôt Git awesome-react-renderer, répertoriant tous les Rendus Personnalisés existants.\nFrançois Zaninotto — Single Page Apps Are Not Dead # React Connection SPA DDD François Zaninotto dresse un panorama des différentes approches pour le rendu d’applications React, telles que File Router, SSR (rendu côté serveur), chacune ayant ses avantages et ses inconvénients.\nIl explore ensuite l’architecture logicielle à travers les design patterns et la méthodologie DDD (Domain-Driven Design) avec les Bounded Contexts. Selon lui, ces concepts ne sont pas compatibles avec File Router ou SSR, mais trouvent leur place dans la vision des Applications Monopages (SPA).\nBien que le SSR réponde souvent à des besoins de performance, François soutient qu’il est possible de contourner ces limitations en utilisant des techniques telles que le lazy loading et les placeholders de chargement. Pour ce qui est de l’optimisation pour les moteurs de recherche (SEO), il mentionne la possibilité de pré-rendre une partie du contenu pour le référencement et de gérer le reste en SPA.\nUn dernier argument En conclusion, il souligne un dernier avantage des SPA : la capacité à héberger le code sur un CDN, améliorant ainsi la rapidité de chargement de l’application web.\nChristophe Porteneuve — A Look at Tomorrow: The Future of React # React Connection Server Components React 19 Christophe Porteneuve nous offre un aperçu du futur de React avec l’avènement du React Server Component (RSC), une nouveauté majeure. Il énumère les évolutions à venir :\nUne adoption accrue et la compatibilité avec davantage de bibliothèques pour le RSC. La stabilisation de son API. Une disponibilité accrue de typages TypeScript (pour GraphQL, le schéma Zod, etc.). L’introduction du React Compiler postérieur à la version 19 de React. Une amélioration de l’instanciation de JSX. En résumé, de nombreuses perspectives prometteuses pour l’avenir de React.\nKadi Kraman — Code Sharing Between Web and React Native # React Native Connection Cross-platform Expo Router Kadi Kraman nous propose une analyse de l’augmentation de l’utilisation des appareils mobiles par rapport aux ordinateurs de bureau pour accéder aux sites web et aux applications.\nAvec cette tendance croissante, la nécessité d’une solution permettant de gérer à la fois le web et le mobile se fait de plus en plus sentir, et React Native apparaît comme un candidat idéal pour une approche cross-platform, à la fois web et mobile.\nIl devient ainsi intéressant de pouvoir partager une partie du code entre l’application web et mobile. Par exemple, Expo Router offre la possibilité de partager la logique de routage et d’affichage, qui est souvent très spécifique entre les applications natives et web.\nUne base commune React Native propose une API permettant de distinguer les environnements web et mobile, offrant ainsi la possibilité d’avoir une logique commune ainsi que des spécificités pour chaque plateforme.\nTomasz Zawadzki — New Architecture is here # React Native Connection New Architecture JSI Tomasz Zawadzki nous présente la toute nouvelle architecture de React Native, comprenant :\nL’introduction d’un bus natif pour gérer de manière asynchrone les changements d’interface utilisateur. La transition d’une pile d’instructions JSON à une interface C++ (JSI) pour le pont entre React et le natif, facilitant ainsi la communication entre JavaScript et les appareils mobiles. L’utilisation de turbo modules, désormais typés avec TypeScript et offrant des abstractions sécurisées, pour accéder aux fonctionnalités natives telles que la caméra et le GPS. Un nouveau moteur de rendu avec JSI pour une meilleure communication avec le natif. Ces améliorations sont toujours en cours de développement, mais de nombreuses bibliothèques de l’écosystème React Native sont déjà compatibles avec cette nouvelle architecture. Tomasz encourage vivement son utilisation dès maintenant pour favoriser son adoption au sein de la communauté.\nEn résumé Dans l’ensemble, cette nouvelle architecture se révèle plus performante dans l’affichage des vues, textes, images, etc., renforçant ainsi la position de React Native comme un choix de développement mobile sérieux.\nReact \u0026amp; React Native Connection — Le mot de la fin # En conclusion, notre participation à React Connection et React Native Connection a été une expérience extrêmement enrichissante pour l’équipe AKAWAKA. Nous avons grandement apprécié cet événement qui nous a permis de nous immerger dans le monde passionnant du développement JavaScript. L’animation était dynamique et engageante, et nous avons été impressionnés par la qualité des présentations et des discussions.\nNous avons également eu l’opportunité d’échanger avec des développeurs passionnés, partageant leurs expériences et leurs idées, ce qui a renforcé notre intérêt pour l’écosystème React.\nEn somme, React Connection et React Native Connection ont été des événements exceptionnels pour AKAWAKA, et nous sommes impatients de participer à d’autres rencontres similaires dans le futur.\nUne application web en React ? Nos équipes conçoivent des interfaces web React performantes, connectées à vos API Symfony et API Platform. Découvrir notre offre de développement ","date":"26 janvier 2024","externalUrl":null,"permalink":"/react-react-native-connection-a-paris/","section":"Actualités","summary":"","title":"React \u0026 React Native Connection à Paris","type":"posts"},{"content":"","date":"26 janvier 2024","externalUrl":null,"permalink":"/tags/react-native/","section":"Tags","summary":"","title":"React Native","type":"tags"},{"content":"","date":"16 janvier 2024","externalUrl":null,"permalink":"/tags/http/","section":"Tags","summary":"","title":"HTTP","type":"tags"},{"content":"","date":"16 janvier 2024","externalUrl":null,"permalink":"/series/mozilla-observatory/","section":"Series","summary":"","title":"Mozilla Observatory","type":"series"},{"content":" Cet article est le dernier d’une série sur les directives testées par Mozilla Observatory. Vous pouvez retrouver notre précédent article sur les Cookies et Subresource Integrity. Nous voici à présent face à la dernière directive majeure évaluée par Mozilla Observatory. Cette directive revêt une importance capitale, car elle a un impact majeur sur les fonctionnalités accessibles à vos utilisateurs sur votre site. Par défaut, le navigateur est configuré pour permettre toutes les actions, ce qui expose votre site à de nombreuses possibilités d’attaques. Nous allons voir ensemble comment restreindre de manière judicieuse ces possibilités afin de protéger vos utilisateurs.\nContent Security Policy # CSP XSS Le CSP est un en-tête HTTP qui permet de définir ce qu’il est possible de faire ou non sur votre site. S’il est possible par exemple de charger des ressources extérieures comme des images, des scripts, etc. S’il est possible de charger des ressources avec HTTP, la version non sécurisée du protocole. Ou encore s’il est possible d’afficher des iframes.\nVous l’avez compris, cette directive permet de verrouiller très finement votre site et d’éviter toute attaque XSS, c’est-à-dire des attaques via l’exécution de script malveillant provenant de l’extérieur.\nÀ manier avec précaution Bien entendu, cette directive est aussi à définir intelligemment : étant très puissante, mal utilisée, elle peut rendre votre site complètement inutilisable pour vos utilisateurs.\nElle doit donc être définie au cas par cas : par exemple, si votre application est une API, il n’est effectivement pas utile de permettre à vos utilisateurs d’afficher des iframes.\nLa directive Content Security Policy est une suite de cibles accompagnées d’une règle de permission.\nExemple minimal de Content-Security-Policy# Désactive l\u0026#39;exécution de script en inline/eval non sécurisé, charge uniquement les images de la même origine, mais autorise également les images d\u0026#39;imgur Content-Security-Policy: default-src \u0026#39;self\u0026#39;; img-src \u0026#39;self\u0026#39; https://i.imgur.com; Les recommandations de Mozilla # Mozilla, dans sa documentation, donne des premiers conseils pour implémenter correctement la directive.\n1 default-src https: La première règle à ajouter est default-src https: qui permet de désactiver l’exécution de scripts et styles directement dans le code et force le chargement des ressources en HTTPS uniquement. 2 default-src https: \u0026lsquo;unsafe-inline\u0026rsquo; Désactiver l’exécution de scripts ou styles depuis le code peut être contraignant sur des sites existants et peut potentiellement casser votre site. default-src https: 'unsafe-inline' permet de forcer le chargement des ressources en HTTPS tout en autorisant les scripts et styles directement dans le code. 3 Restreindre par type de ressource Ensuite, on peut autoriser le chargement des ressources image, script et style uniquement depuis le même domaine ou sur certains domaines avec default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'. 4 Interdire les plugins Les ressources de plugin telles que Flash ou Silverlight devraient être interdites si non nécessaires avec object-src 'none'. Vous pouvez retrouver toutes les recommandations de Mozilla sur leur documentation de CSP.\nPolitiques Content-Security-Policy courantes# Désactive l\u0026#39;exécution inline/eval non sécurisé, autorise uniquement le chargement de ressources (images, polices, scripts, etc.) via https Content-Security-Policy: default-src https: # Désactive l\u0026#39;exécution inline/eval non sécurisés, autorise tout le reste sauf l\u0026#39;exécution du plugin Content-Security-Policy: default-src *; object-src \u0026#39;none\u0026#39; # Désactive l\u0026#39;exécution inline/eval non sécurisée, charge uniquement les ressources de la même origine, mais autorise également les images d\u0026#39;imgur # Désactive l\u0026#39;exécution des plugins Content-Security-Policy: default-src \u0026#39;self\u0026#39;; img-src \u0026#39;self\u0026#39; https://i.imgur.com; object-src \u0026#39;none\u0026#39; # Désactive l\u0026#39;exécution inline/eval et les plugins non sécurisés, charge uniquement les scripts et les feuilles de style de la même origine, les polices de Google, # et images de même origine et imgur. Les sites devraient viser des politiques comme celle-ci. Content-Security-Policy: default-src \u0026#39;none\u0026#39;; font-src https://fonts.gstatic.com; img-src \u0026#39;self\u0026#39; https://i.imgur.com; object-src \u0026#39;none\u0026#39;; script-src \u0026#39;self\u0026#39;; style-src \u0026#39;self\u0026#39; # Site préexistant qui utilise trop de code en ligne à corriger # mais veut s\u0026#39;assurer que les ressources sont chargées uniquement via https, tout en désactivant les plugins Content-Security-Policy: default-src https: \u0026#39;unsafe-eval\u0026#39; \u0026#39;unsafe-inline\u0026#39;; object-src \u0026#39;none\u0026#39; # Ne pas encore mettre en œuvre la politique ; au lieu de cela, signale simplement les violations qui auraient eu lieu via l\u0026#39;url /csp-violation-report-endpoint/ # Utile lorsqu\u0026#39;on n\u0026#39;est pas sûr d\u0026#39;une règle et qu\u0026#39;on veut mesurer son impact Content-Security-Policy-Report-Only: default-src https:; report-uri /csp-violation-report-endpoint/ # Désactive le chargement de toutes les ressources et désactive les iframes, recommandé pour les API Content-Security-Policy: default-src \u0026#39;none\u0026#39;; frame-ancestors \u0026#39;none\u0026#39; En vrac # Referrer Policy # Referrer-Policy Vie privée Referrer Policy est un en-tête HTTP qui permet de gérer la traçabilité de la provenance d’un visiteur. Par défaut, lors de la visite d’un lien, la requête HTTP possède l’information d’où provient le visiteur : cela peut être depuis un moteur de recherche, un réseau social ou tout simplement d’un autre site. Avec cette directive, on peut redonner de l’anonymat aux utilisateurs. Elle possède plusieurs valeurs possibles :\nno-referrer : on demande à ne jamais fournir l’information de provenance. same-origin : on demande à fournir l’information de provenance seulement si elle est du même domaine. strict-origin : même chose que same-origin, mais on ne fournit pas le chemin de l’URL, c’est-à-dire qu’on ne communique que le nom de domaine. strict-origin-when-cross-origin : envoyer la provenance complète si depuis la même origine, sinon l’URL sans le chemin sur les origines étrangères. Exemples de configuration Referrer-Policy# Sur example.com, envoie uniquement l\u0026#39;en-tête Referer vers d\u0026#39;autres ressources example.com Referrer-Policy: same-origin # Envoie uniquement le référent abrégé vers une origine étrangère, le référent complet vers un hôte local Referrer-Policy: strict-origin-when-cross-origin # Désactive les référents pour les navigateurs qui ne prennent pas en charge l\u0026#39;origine stricte lorsque l\u0026#39;origine est croisée # Utilise strict-origin-when-cross-origin pour les navigateurs qui le font Referrer-Policy: no-referrer, strict-origin-when-cross-origin Referrer-Policy via balise HTML et attribut de lien\u0026lt;!-- Faites pareil, mais avec une balise méta --\u0026gt; \u0026lt;meta http-equiv=\u0026#34;Referrer-Policy\u0026#34; content=\u0026#34;no-referrer, strict-origin-when-cross-origin\u0026#34;\u0026gt; \u0026lt;!-- Faites de même, mais uniquement pour un seul lien --\u0026gt; \u0026lt;a href=\u0026#34;https://example.org/\u0026#34; referrerpolicy=\u0026#34;no-referrer, strict-origin-when-cross-origin\u0026#34;\u0026gt; X-XSS-Protection # X-XSS-Protection, ancêtre de la directive Content-Security-Policy, n’est plus utilisé aujourd’hui sur les navigateurs modernes ; il peut toutefois être utile pour de la rétrocompatibilité avec d’anciens navigateurs.\nMozilla Observatory — Le mot de la fin # Voilà qui clôture notre tour de l’outil Observatory de Mozilla. Chez AKAWAKA, nous sommes convaincus de son importance pour sécuriser nos utilisateurs. Cet outil fait partie de nos nombreux points de contrôle lors de nos audits.\nUne Content Security Policy sans casser votre site ? Nos audits évaluent la sécurité de vos applications, de la configuration HTTP au code, et vous accompagnent pour mettre en place les bonnes directives. Découvrir notre offre d’audit ","date":"16 janvier 2024","externalUrl":null,"permalink":"/securisons-nos-utilisateurs-avec-mozilla-observatory-partie-4-content-security-policy/","section":"Actualités","summary":"","title":"Sécurisons nos utilisateurs avec Mozilla Observatory partie 4 – Content Security Policy","type":"posts"},{"content":"","date":"16 janvier 2024","externalUrl":null,"permalink":"/tags/s%C3%A9curit%C3%A9/","section":"Tags","summary":"","title":"Sécurité","type":"tags"},{"content":" Cet article fait partie d’une suite d’articles sur les directives testées par Mozilla Observatory. Vous pouvez retrouver notre précédent article sur X-Frame-Options et CORS.\nOn continue notre exploration avec deux nouveaux tests très importants, car axés sur le vol de données et l’injection de script malveillant.\nCookies # Cookies Session CSRF Les cookies sont partout : lorsqu’ils ne servent pas à tracker les utilisateurs, ils sont utilisés pour persister une connexion à un service. Et c’est pour cette utilisation que les hackers souhaitent les récupérer à l’insu des utilisateurs.\nLe risque Lorsqu’il est mal configuré, un cookie est accessible directement depuis un script JavaScript via document.cookie. Imaginons donc qu’une personne arrive à introduire un script malveillant sur votre site – nous verrons comment plus loin – il lui serait parfaitement possible de récupérer les cookies d’un utilisateur et d’usurper sa connexion.\nHeureusement, les cookies ont des options de configuration qui permettent de les rendre plus sécurisés.\nLes options d’un cookie # Lorsqu’on crée un cookie, on peut lui associer des options :\nSecure : permet de limiter l’utilisation du cookie aux seules requêtes HTTPS. HttpOnly : permet d’interdire la lecture des cookies en dehors des requêtes HTTP, cela bloquera donc sa lecture dans un script JavaScript. Expires : permet de définir la date d’expiration du cookie, cela évite d’avoir des sessions ouvertes à l’infini (et donc d’être vulnérable dans le temps). Max-Age : même chose que Expires, mais exprimé en secondes relatives à la date de création du cookie. Domain : permet de limiter l’utilisation d’un cookie à un domaine spécifique, inutile de rendre votre cookie de session disponible sur d’autres sites. Path : permet de limiter le cookie à un certain niveau d’URL de votre site, par exemple limiter son utilisation à /admin. SameSite : permet de limiter l’utilisation de cookie lorsqu’on fait appel à des ressources extérieures au site (par exemple via une balise). Cela permet d’éviter qu’un cookie utilisateur soit transmis par défaut aux requêtes de chargement de média. Très utile pour se protéger des attaques CSRF. Deux valeurs sont possibles : Strict : le navigateur envoie uniquement le cookie pour les requêtes vers le même site d’origine du cookie. Lax : le navigateur envoie également le cookie lorsque la personne navigue vers le site d’origine du cookie (même si elle vient d’un site différent), par exemple lorsqu’elle suit un lien depuis un site externe. Les préfixes # Il est également possible de préfixer le nom des cookies pour ajouter une couche de sécurité et éviter par exemple leur surcharge.\n__Host- : à utiliser pour tous les cookies nécessaires uniquement sur un domaine spécifique (pas de sous-domaines) où Path est défini sur /. __Secure- : à utiliser pour tous les autres cookies envoyés depuis des origines sécurisées (telles que HTTPS). Comme d’habitude, Mozilla ajoute des exemples que vous retrouverez sur leur documentation :\nExemples de configurations Set-Cookie# Cookie d\u0026#39;identifiant de session accessible uniquement sur cet hôte qui est purgé lorsque l\u0026#39;utilisateur ferme son navigateur Set-Cookie: MOZSESSIONID=980e5da39d4b472b9f504cac9; Path=/; Secure; HttpOnly # Identifiant de session pour tous les sites example.org qui expire dans 30 jours en utilisant le préfixe __Secure- # Ce cookie n\u0026#39;est pas envoyé d\u0026#39;origine croisée, mais est envoyé lors de la navigation vers un site Mozilla à partir d\u0026#39;un autre site Set-Cookie: __Secure-MOZSESSIONID=7307d70a86bd4ab5a00499762; Max-Age=2592000; Domain=example.org; Path=/; Secure; HttpOnly; SameSite=Lax # Définit un cookie de longue durée pour l\u0026#39;hôte actuel, accessible par JavaScript, lorsque l\u0026#39;utilisateur accepte les ToS # Ce cookie est envoyé lors de la navigation vers votre site, envoyé depuis un autre site, par exemple en cliquant sur un lien Set-Cookie: __Host-ACCEPTEDTOS=true; Expires=Fri, 31 Dec 9999 23:59:59 GMT; Path=/; Secure; SameSite=Lax # Identifiant de session utilisé pour un site sécurisé, tel que bugzilla.example.org. Il n\u0026#39;est pas envoyé depuis une origine croisée # requêtes, et elles ne sont pas non plus envoyées lors de la navigation vers bugzilla.example.org depuis un autre site. Utilisé conjointement avec autres mesures anti-CSRF, c\u0026#39;est un moyen très efficace de défendre votre site contre les attaques CSRF. Set-Cookie: __Host-BMOSESSIONID=YnVnemlsbGE=; Max-Age=2592000; Path=/; Secure; HttpOnly; SameSite=Strict Vérifiez vos frameworks Aujourd’hui, la plupart des frameworks modernes font le minimum pour rendre vos cookies sécurisés, mais il peut être intéressant de regarder plus en détail la configuration des cookies de vos applications.\nSubresource Integrity # SRI CDN Supply chain Comme on l’a vu plus haut, pour pouvoir voler un cookie, il faut avoir réussi à injecter du code malveillant sur un site. Il existe plein de techniques différentes pour ce faire, dont la plupart peuvent être contrées via des mesures de sécurité directement dans le code de votre application.\nMais il existe une autre manière d’injecter du code malveillant, indépendamment de votre volonté : celle d’introduire du code depuis une source externe que vous utilisez sur votre site. Cela peut être fait par exemple en voulant charger une librairie JavaScript depuis un CDN.\nLorsqu’on souhaite charger une librairie externe depuis un CDN via la balise \u0026lt;script\u0026gt;, on peut lui ajouter deux attributs :\nintegrity : permet de définir un hash qui est la signature du fichier que vous recevez. Le navigateur va générer sa propre signature lors de la réception du fichier, et s’il constate une différence, il va bloquer le chargement de cette ressource. La plupart des CDN vous fournissent le hash de la librairie que vous souhaitez utiliser. crossorigin : attend la valeur anonymous spécifiant au navigateur de faire une requête anonyme, sans cookie. Chargement d\u0026#39;un script depuis un CDN avec SRI\u0026lt;!-- Chargement de jQuery 4.0.0 --\u0026gt; \u0026lt;script src=\u0026#34;https://cdnjs.cloudflare.com/ajax/libs/jquery/4.0.0-beta/jquery.js\u0026#34; integrity=\u0026#34;sha512-5DIV4rFAkqgNzEqQuiczycmrnUZW8/+Gj7Dbhc5Ga6UYMPMV3CeSnMO6f0xy9G9kSgd1buwT6WlFS5VO7ATNDQ==\u0026#34; crossorigin=\u0026#34;anonymous\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; Vous pouvez générer vous-même votre hash depuis une source de confiance :\nGénérer un hash SRI$ curl -s https://cdnjs.cloudflare.com/ajax/libs/jquery/4.0.0-beta/jquery.js | \\ openssl dgst -sha384 -binary | \\ openssl base64 -A Et avec les frameworks JS ? Il n’est pas toujours possible d’avoir la main sur les chargements de librairies externes, surtout lorsqu’on utilise des solutions comme Next.js ou Nuxt qui chargent automatiquement des ressources. Des solutions existent tout de même, qui sortent du cadre de cet article. Je vous propose de voir la conférence d’Antoine Caron qui donne des pistes.\nBonus : X-Content-Type-Options # MIME sniffing Directive bonus qui permet d’éviter le comportement par défaut des navigateurs qui essaient de deviner le type MIME d’un fichier. Cela évite à votre navigateur d’exécuter du script contenu dans une image, car il a détecté que c’était en réalité du JavaScript.\nEn-tête X-Content-Type-Options# Empêcher les navigateurs de détecter incorrectement les non-scripts en tant que scripts X-Content-Type-Options: nosniff Le prochain article sera le dernier et nous verrons la directive Content Security Policy, un gros morceau. Elle permet de définir très finement les actions possibles sur un site. Par exemple, interdire le chargement de ressources en HTTP.\n👉 La suite : Partie 4 – Content Security Policy.\nVos utilisateurs sont-ils protégés contre le vol de session ? Cookies, scripts tiers, en-têtes de sécurité : nos audits identifient les points faibles de vos applications et vous accompagnent dans leur correction. Découvrir notre offre d’audit ","date":"9 janvier 2024","externalUrl":null,"permalink":"/securisons-nos-utilisateurs-avec-mozilla-observatory-partie-3-cookie-et-subresource-integrity/","section":"Actualités","summary":"","title":"Sécurisons nos utilisateurs avec Mozilla Observatory partie 3 – Cookie et Subresource Integrity","type":"posts"},{"content":" Cet article fait partie d’une série d’articles consacrés à Mozilla Observatory. Vous pouvez retrouver le premier article parlant des règles HTTPS et redirection.\nContinuons notre présentation des règles de sécurité testées par Mozilla Observatory et comment les corriger.\nX-Frame-Options # Iframe Clickjacking CSP Cette directive de sécurité est essentielle pour définir la politique à suivre lors de l’intégration de votre site web dans une balise iframe. Bien que l’usage des iframes puisse sembler désuet aujourd’hui, à l’exception de certains cas comme l’intégration de widgets (vidéos, cartes, etc.), il ne faut pas sous-estimer leur pertinence. En effet, les iframes sont encore largement utilisées, notamment dans des pratiques malveillantes comme le détournement de données. L’utilisation judicieuse de l’en-tête HTTP X-Frame-Options s’avère donc cruciale pour renforcer la sécurité et prévenir les tentatives de vol de données par le biais de contenu intégré non autorisé.\nLe scénario d’attaque # Imaginez qu’un individu malintentionné acquière un nom de domaine semblable à celui de votre site web. Cette personne pourrait alors intégrer votre site dans une iframe sur sa propre page, se mettant ainsi en position de contrôler tout ce qui se passe au sein de cette iframe. Cela ouvre la porte à des pratiques malveillantes, comme la capture de sessions utilisateur, le vol d’identifiants ou d’autres données sensibles. L’utilisateur final, ne remarquant pas la supercherie, pourrait interagir avec l’iframe en pensant naviguer sur le site authentique.\nLa parade # Dans la plupart des cas, on ne souhaite pas que notre site puisse être affiché dans une iframe. Heureusement l’en-tête HTTP X-Frame-Options permet de dire au navigateur comment notre site doit se comporter au sein de celle-ci.\nX-Frame-Options et CSP À noter que la directive X-Frame-Options est dépréciée au profit de Content-Security-Policy. Mais pour une compatibilité optimale avec tous les navigateurs, il est préférable de mettre les deux.\nOn retrouve trois stratégies différentes :\nDENY / none : on bloque tout simplement la possibilité d’afficher le site dans une iframe. SAMEORIGIN / self : on autorise seulement d’afficher notre site dans une iframe si nous sommes sur le même nom de domaine. En d’autres termes, on accepte d’afficher un site A dans une iframe, mais seulement à partir du site A. ALLOW-FROM : on autorise d’afficher notre site dans une iframe seulement pour les noms de domaine cités. Exemples X-Frame-Options et CSP frame-ancestors# Block site from being framed with X-Frame-Options and CSP Content-Security-Policy: frame-ancestors \u0026#39;none\u0026#39; X-Frame-Options: DENY # Only allow my site to frame itself Content-Security-Policy: frame-ancestors \u0026#39;self\u0026#39; X-Frame-Options: SAMEORIGIN # Allow only framer.example.org to frame site Content-Security-Policy: frame-ancestors https://framer.example.org X-Frame-Options: ALLOW-FROM https://framer.example.org Cross-Origin Resource Sharing # CORS API Le CORS (Cross-Origin Resource Sharing) est souvent perçu comme un véritable casse-tête pour les développeurs d’applications web qui consomment des API. Cependant, il s’agit d’une mesure de sécurité essentielle conçue pour protéger vos applications contre les requêtes provenant de sources inconnues ou non autorisées. Par défaut, les navigateurs sont configurés pour restreindre et contrôler l’accès aux API depuis des domaines différents de celui d’origine, garantissant ainsi que seules les requêtes fiables et prévues sont traitées.\nJe ne vais pas entrer dans les détails techniques du fonctionnement du CORS, ni souligner son importance ici. Si vous êtes intéressés par une compréhension approfondie de ce mécanisme, je vous invite à consulter mon article dédié au CORS appliqué aux applications Node. Dans cet article, j’aborde en profondeur tous les aspects pertinents, fournissant ainsi une ressource complète sur le sujet.\nDe nos jours, la majorité des développeurs sont au fait des principes de sécurité CORS. Mais il arrive souvent que son implémentation soit effectuée de manière trop permissive. Pour administrer le CORS, l’en-tête HTTP Access-Control-Allow-Origin est utilisé pour spécifier une liste d’origines autorisées à interagir avec votre API.\nExemple Access-Control-Allow-Origin# Allow https://random-dashboard.example.org to read the returned results of this API Access-Control-Allow-Origin: https://random-dashboard.example.org Aller plus loin Il est également crucial de connaître les en-têtes HTTP Access-Control-Allow-Methods et Access-Control-Allow-Headers. Ces derniers offrent la possibilité de limiter l’accès à certaines méthodes HTTP spécifiques et à certains en-têtes HTTP. Cela renforce le contrôle sur la manière dont vos API sont consommées. Bien que cette pratique puisse sembler fastidieuse pour une API publique, elle assure une sécurité accrue lorsque vos API sont destinées à être utilisées par un groupe restreint de clients fiables.\n👉 La suite : Partie 3 – Cookies et Subresource Integrity.\nVos en-têtes de sécurité sont-ils bien configurés ? Iframes, CORS, CSP : nos audits passent en revue la configuration de sécurité de vos applications et vous aident à la corriger. Découvrir notre offre d’audit ","date":"31 janvier 2024","externalUrl":null,"permalink":"/securisons-nos-utilisateurs-avec-mozilla-observatory-partie-2-x-frame-options-et-cors/","section":"Actualités","summary":"","title":"Sécurisons nos utilisateurs avec Mozilla Observatory partie 2 – X-Frame-Options et CORS","type":"posts"},{"content":" Nous avons eu la chance d’assister, lors d’un Meetup de LyonJS, à la conférence d’Antoine Caron sur l’outil Mozilla Observatory. Il dresse un constat intéressant : pourquoi avons-nous tendance à croire que nous sommes en sécurité sur Internet, alors que les navigateurs pourraient être comparés, selon lui, à des coffres-forts dont la porte serait grande ouverte ? Ainsi, nos utilisateurs ne sont pas à l’abri tant que les navigateurs leur permettent d’être la cible d’attaques, telles que le vol de session via un lien dissimulant une injection de script JavaScript.\nPour sensibiliser aux risques de ces attaques potentielles, Mozilla a mis au point un outil permettant d’analyser les failles de sécurité éventuelles d’un site tout en fournissant des conseils de correction. En tant que développeurs d’applications, il nous incombe de protéger nos utilisateurs en installant les bons mécanismes de verrouillage pour refermer cette porte.\nMozilla Observatory # Dans cette série d’articles, nous allons voir les principales erreurs que peut remonter l’outil Mozilla Observatory, les comprendre et voir comment les corriger.\nLorsqu’on arrive sur le site https://observatory.mozilla.org/, on nous invite à rentrer l’URL du site que l’on souhaite analyser. Essayons donc avec akawaka.fr.\nOn obtient une note de D, sachant que la pire note est F. Ce qui est bien, mais pas top ! En regardant la fiche de résultat, on remarque trois sections :\n1 La notation En haut à gauche, des infos sur la notation du site : on remarque ici un score de 35/100 avec 6 tests passés sur 11. Sachez également que par défaut, votre analyse sera conservée dans les statistiques publiques de Mozilla. 2 La recommandation prioritaire En haut à droite, la règle la plus urgente à corriger. Ici Mozilla Observatory nous conseille d’ajouter l’en-tête X-Frame-Options avant toute chose. 3 Le détail des règles Enfin, la liste de toutes les règles évaluées par Mozilla Observatory sur notre site, avec pour chacune le résultat du test et son score. HTTPS et redirection # HTTPS Redirection HSTS Aujourd’hui, le sujet de mettre HTTPS ou non sur un site est devenu un non-sujet avec l’arrivée de Let’s Encrypt et surtout de la gratuité des certificats. Encore faut-il correctement configurer la redirection pour ne pas laisser les visiteurs accéder au site sous HTTP.\nPour chaque règle, Mozilla nous fournit un lien vers leur documentation avec une explication de la règle évaluée, ainsi que des éléments de réponse pour corriger.\nLa redirection HTTP vers HTTPS # Dans le cas de la règle Redirection, la documentation nous dit qu’un site doit être disponible via le protocole HTTPS et que tout accès au site via le protocole non sécurisé HTTP doit être redirigé vers sa version sécurisée. Pour ce faire, c’est au niveau de la configuration du serveur HTTP que cela se passe et Mozilla nous fournit un exemple pour les deux principales solutions, Nginx et Apache.\nnginx : redirection HTTP → HTTPS# Redirect all incoming http requests to the same site and URI on https, using nginx server { listen 80; return 301 https://$host$request_uri; } Apache : redirection HTTP → HTTPS# Redirect for site.example.org from http to https, using Apache \u0026lt;VirtualHost *:80\u0026gt; ServerName site.example.org Redirect permanent / https://site.example.org/ \u0026lt;/VirtualHost\u0026gt; Si cette règle est plutôt bien connue de la majorité, la suivante l’est un peu moins.\nHTTP Strict Transport Security (HSTS) # HTTP Strict Transport Security : cet en-tête HTTP permet de dire au navigateur que la prochaine fois qu’il se connectera au site avec le protocole HTTP, pas besoin d’initier la requête, il doit passer directement sur le protocole HTTPS.\nPlus strict sur les erreurs TLS Sachez également que cet en-tête force le navigateur à être plus strict sur les erreurs TLS et interdit à l’utilisateur d’ignorer ces erreurs. Par exemple via une page sensibilisant l’utilisateur qu’il prend un risque s’il continue sur ce site alors que le certificat semble erroné.\nCet en-tête possède 3 paramètres :\nmax-age : définit le temps en secondes durant lequel le navigateur effectue la redirection automatiquement. includeSubDomains (optionnel) : définit que la règle s’applique également aux sous-domaines du domaine courant. Par exemple pour domain.example.com, la redirection en HTTPS sera également faite sur host1.domain.example.com, host2.domain.example.com, etc. preload (optionnel) : ce paramètre permet d’inscrire notre site dans la “Preload HSTS list”. C’est une liste, initialement faite pour Chrome, regroupant tous les sites définissant l’en-tête HSTS et donc certifiant que son site est bien disponible en HTTPS. Aujourd’hui la majorité des navigateurs regardent dans cette liste pour savoir si un site est bien accessible en HTTPS. Vous pouvez ajouter le vôtre manuellement via le site https://hstspreload.org/, ou ajouter l’option preload. Enfin, Mozilla nous donne quelques exemples pour illustrer cet en-tête.\nExemples d\u0026#39;en-têtes HSTS# Only connect to this site via HTTPS for the two years (recommended) Strict-Transport-Security: max-age=63072000 # Only connect to this site and subdomains via HTTPS for the next two years and also include in the preload list Strict-Transport-Security: max-age=63072000; includeSubDomains; preload Mozilla Observatory — À suivre # Nous verrons la suite des règles dans nos prochains articles, les attaques concernées et comment s’en prémunir.\nChez AKAWAKA, nous sommes fermement convaincus de la valeur de l’outil Mozilla Observatory. C’est pourquoi il est désormais intégré à nos nombreux points de contrôle en plus de la qualité et des bonnes pratiques du code de votre application, l’outillage de votre environnement de développement, les processus d’intégration et de déploiement continu, et bien d’autres aspects.\nN’hésitez pas à nous contacter si votre site obtient une note défavorable. Nous serons ravis de vous accompagner, que ce soit pour la mise en œuvre ou pour des conseils, afin d’améliorer la sécurité de votre plateforme.\n👉 La suite : Partie 2 – X-Frame-Options et CORS.\nQuelle note obtient votre site sur Mozilla Observatory ? En-têtes de sécurité, configuration serveur, qualité du code : nos audits identifient les failles et vous accompagnent dans leur correction. Découvrir notre offre d’audit ","date":"22 janvier 2024","externalUrl":null,"permalink":"/securisons-nos-utilisateurs-avec-mozilla-observatory-https-et-redirection/","section":"Actualités","summary":"","title":"Sécurisons nos utilisateurs avec Mozilla Observatory partie 1 – HTTPS et redirection","type":"posts"},{"content":" Cette année la SymfonyCon s’est déroulée à Bruxelles, au Square Conference Center. Plus de 1200 personnes étaient présentes pour se retrouver autour du framework Symfony. Au programme : des conférences, des échanges et une communauté impliquée. Retour sur les talks qui nous ont le plus marqués. Fabien Potencier — Keynote # Keynote Console Terminal Pour commencer, Fabien Potencier, créateur de Symfony, nous présente ses dernières idées pour le framework, notamment la partie console.\nEn l’occurrence un nouveau composant, Terminal, nous permet de repousser les limites du terminal. Il ne s’agit pas simplement d’une refonte du composant existant Console. En effet, il est désormais possible de créer de véritables applications au sein du terminal.\nUne partie du composant est inspirée de ce que proposent le HTML et le CSS. On retrouve donc des notions de styles, stylesheets, padding, margin, etc.\nPour conclure sa keynote, Fabien nous propose une démo d’une application avec un pager, une scrollbar, la lecture du clavier ou du trackpad, le tout à l’intérieur du terminal.\nNicolas Grekas — Symfony, PHP and its Foundation # PHP Foundation Communauté La conférence de Nicolas Grekas porte sur la création de la PHP Foundation. Créée suite au constat que la maintenance et l’évolution du langage reposent sur peu de développeurs, la fondation a pour objectif de rendre l’avenir du langage plus serein.\nEn d’autres termes la mission de la PHP Foundation est d’assurer la prospérité à long terme, de garantir une maintenance de haute qualité, de maintenir les contributeurs actuels et d’en accueillir de nouveaux, tout en promouvant l’image de PHP.\nEn ce qui concerne sa composition, la fondation est composée de 6 développeurs, 9 membres du conseil (une personne par société fondatrice) et 5 membres de la communauté. Seuls les développeurs sont rémunérés par la fondation, qui est financée par des entreprises et des particuliers souhaitant soutenir le projet. À ce jour, 1,1 millions d’euros ont été levés à cette fin.\nLes développeurs membres de la fondation ont jusqu’à présent travaillé sur des sujets tels que l’autoloading, les hooks de propriété (sorte de propriétés virtuelles), les objets “lazy”, une méthode pour cloner et modifier des objets, une refonte de PECL, ainsi que le support des schémas JSON.\nRémi Janot — Expression Language in Symfony : Beyond the Framework # Expression Language Règles métier Pendant cette conférence Rémi Janot aborde le composant Expression Language de Symfony pour résoudre des problématiques métier. Ce composant, largement utilisé au sein de Symfony pour configurer nos applications, peut également être exploité pour gérer toute une série de règles.\nRémi explique qu’ayant travaillé en startup, les règles peuvent évoluer tous les jours. C’est là que le composant s’avère très utile, car il permet d’introduire des changements de comportement sans nécessiter l’intervention d’un développeur.\nLe composant utilise un pseudo-code qui est interprété et que l’on peut enrichir avec des fonctions. Ce pseudo-code permet de ne pas exécuter du code PHP qui serait stocké, le but étant de garantir un niveau de sécurité élevé. Pour améliorer les performances du composant, il est possible de compiler les expressions en code PHP qui sera mis en cache dans nos applications.\nÀ retenir En fin de compte, grâce à ce composant, il est possible de laisser la main à des administrateurs pour implémenter leurs propres règles métier.\nKévin Dunglas — Symfony Apps as Standalone Binaries # FrankenPHP Binaires Le sujet de la conférence Symfony de Kévin Dunglas porte sur la création de binaires embarquant une application PHP. Pour bien commencer, il publie la version 1.0.0 de FrankenPHP en direct, qui sera utile pour créer ces binaires.\nKévin nous rappelle ce dont nous avons besoin pour faire fonctionner une application PHP :\nUn serveur web Un exécuteur PHP Un certain nombre d’extensions PHP Une base de données Afin d’atteindre son objectif, l’application doit suivre plusieurs critères. L’utilisateur final ne doit pas savoir que l’application est écrite en PHP. Elle doit donc embarquer tout ce qui est nécessaire pour faire fonctionner du code PHP, y compris les assets, les vendors, et le code source du projet, qui doivent tous être inclus dans le binaire.\nFrankenPHP inclut désormais un script prêt à l’emploi pour créer des binaires PHP. Ce script repose sur Caddy comme serveur web, static-php-cli pour générer un binaire contenant PHP et toutes les extensions nécessaires, et bien évidemment FrankenPHP.\nÀ retenir Il est maintenant plus simple que jamais de déployer des applications PHP sur un système où nous n’avons pas la main.\nSymfonyCon 2023 — Le mot de la fin # Cette édition de la SymfonyCon à Bruxelles était particulièrement enrichissante. Nous avons pu faire de belles rencontres, discuter avec les membres de la communauté et en apprendre davantage sur Symfony. Pour les plus intéressés, cette édition s’est terminée par un Hack Day, au cours duquel les développeurs expérimentés et novices ont pu contribuer à Symfony.\nNous sommes impatients de participer à l’édition de l’année prochaine, qui a été annoncée et se déroulera en Autriche, à Vienne.\nUn projet Symfony à lancer ou à faire évoluer ? Nos experts Symfony vous accompagnent de l’audit au développement, de la montée de version à l’industrialisation. Découvrir notre expertise Symfony ","date":"21 janvier 2023","externalUrl":null,"permalink":"/symfonycon-2023-a-bruxelles/","section":"Actualités","summary":"","title":"SymfonyCon 2023 à Bruxelles","type":"posts"},{"content":" Une nouvelle fois cette édition du Forum PHP s’est déroulée au sein des salles de conférences de l’hôtel Marvel, au parc Disneyland Paris. Au-delà du confort des lieux et de la qualité de service fournie par notre hôte Mickey, cette année a offert un panel diversifié de conférences, dans un cadre à la fois plaisant et propice à quelques emplettes avant le retour (pour les enfants bien sûr). Malgré l’impossibilité de participer à toutes les conférences, dû à l’incapacité de se dédoubler et aux contraintes horaires liées à mon train de retour, j’ai tout de même pu pleinement profiter de cette nouvelle édition. Je vous emmène à travers un survol de mes deux journées riches en découvertes au Forum.\nMatheo Daninos — Symfony se met au front, à votre tour maintenant # Jour 1 Symfony UX Twig Components La première conférence, animée par Matheo Daninos, a offert un aperçu des TwigComponent et LiveComponent (qui font partie de la suite Symfony UX). Cette présentation visait à encourager les développeurs back-end à renouer avec le front-end au sein des applications Symfony.\nDes exemples ont étayé ses propos et il est vrai que l’approche est intéressante et peut répondre à certains besoins (prototypages, projet ayant un front peu complexe, etc). La conférence incite à explorer ce domaine.\nBaptiste Langlade — Augmentez votre couverture : supprimez des tests ! # Jour 1 Tests Property Based Testing Baptiste Langlade nous a fait découvrir une méthodologie de rédaction de tests, adoptée au sein de son entreprise. Le Property Based Testing, introduisant une dose d’aléatoire (d’entropie plus exactement) dans vos tests, permet une couverture maximale des cas.\nLe bénéfice Cette approche accroît la couverture de votre code tout en réduisant étonnamment le besoin de rédiger de nouveaux tests.\nLe sujet est extrêmement intéressant. Je vous encourage à consulter le repo du package BlackBox, utilisé par Baptiste et son équipe, pour mieux appréhender l’idée sous-jacente du Property Based Testing.\nGrégory Planchat — J’ai créé un service SaaS, voyons ce qu’il ne faut pas faire # Jour 1 SaaS Migration Grégory Planchat a mis en lumière les défis rencontrés par lui et son équipe lors de la migration de leur ETL vers un modèle SaaS, agrémenté de nombreux conseils pour éviter les écueils (prévus ou non) qu’ils ont pu rencontrer.\nLa présentation a permis à chaque participant de repartir avec des informations et des conseils pertinents, utiles non seulement pour une migration vers un modèle SaaS, mais également pour tout projet de migration.\nMaxime Veber — Un moteur de collision en PHP # Jour 1 FFI SDL La conférence de Maxime Veber a mis l’accent sur l’utilisation de FFI, disponible depuis PHP 7.4, au sein d’une application.\nMaxime a exposé comment intégrer cette fonctionnalité dans un contexte spécifique, en utilisant la SDL avec PHP pour relever le défi de recréer un jeu entièrement en PHP, incluant ainsi un moteur de collision.\nCette conférence a résonné avec une présentation similaire de l’année précédente, animée par Pierre Pelisset, qui portait également sur l’utilisation de FFI.\nFlorian Merle — Utilisez la bibliothèque standard PHP (SPL) au quotidien # Jour 1 SPL Structures de données Vous pensiez tout connaître de PHP ? Eh bien c’était sans compter sur Florian Merle et ses découvertes, toujours plus intéressantes (et souvent originales). C’est donc au travers d’un player musical que nous ont été dévoilés des aspects méconnus de PHP, révélant une partie de la richesse de la SPL.\nAu programme : des structures de données, des itérateurs, des exceptions, ainsi que des considérations relatives à la consommation mémoire et aux performances. De plus, Florian a mis en lumière une extension PHP méconnue, php-ds (pour Data Structures).\nUne conférence aussi instructive que divertissante.\nBenoit Viguier — ReactPHP, Amp, RevoltPHP : comparatif des frameworks asynchrones # Jour 1 Asynchrone ReactPHP Ma curiosité m’a poussé à assister à la conférence de Benoit Viguier, n’ayant jamais pratiqué d’asynchrone en PHP. Je suis ressorti de cette session avec le cerveau en ébullition !\nBenoit a su démystifier ce sujet peu commun pour les développeurs PHP, présentant les spécificités techniques et les concepts avec pédagogie. Sa référence à Queen pour illustrer les principes de l’asynchrone a certainement su captiver l’audience.\nPassionné et maîtrisant son sujet, Benoit nous a embarqués dans une aventure musicale, avec un rythme soutenu, témoignant de son expertise technique sur le sujet.\nXavier Gorse — Équilibre pro/perso : expérimentation autour du temps de travail et de la rémunération # Jour 1 Organisation du travail Plongée dans le monde de l’entreprise avec Xavier Gorse pour mettre en lumière les initiatives qu’il expérimente avec ses collaborateurs au sein d’Elao, visant à établir un équilibre entre vie professionnelle et personnelle.\nCe sujet captivant, bien que forcément survolé, soulève des questions d’ordre juridique, social et même philosophique sur notre rapport au travail. La présentation a illustré quelques exemples de chemins explorés en interne, ouvrant ainsi la voie à de nouvelles possibilités en entreprise.\nCette conférence, inspirante pour les indépendants, les salariés et les chefs d’entreprise, a démontré l’importance croissante de repenser les dynamiques traditionnelles de travail pour favoriser un équilibre sain entre vie professionnelle et personnelle.\nPour ma part, j’ai arrêté ici ma journée, la tête bien remplie par toutes les informations ingérées durant ce premier jour.\nLaetitia Avrot — Index Wars : le pouvoir des Jedi des index dans l’univers de Postgres # Jour 2 PostgreSQL Index En plein univers Disney, la spécialiste de Postgres, Laetitia Avrot, nous a présenté l’importance des index dans nos bases de données lors de sa conférence, inspirée de l’univers Star Wars.\nAvec son aide, nous avons exploré les subtilités techniques entourant les index : comment optimiser leur usage, leur fonctionnement, ainsi que le choix du type d’index en fonction du contexte d’utilisation, tout en soulignant les moments où il est préférable de ne pas en créer, etc.\nPour aller plus loin Dans un environnement où l’utilisation des bases de données est omniprésente, cette présentation a offert une multitude de conseils pratiques, accompagnés d’une ressource précieuse à explorer.\nCharles Desneuf — PhpStorm \u0026lt;3 # Jour 2 PhpStorm Productivité La majorité d’entre nous utilisons PhpStorm au quotidien. Pourtant, très peu exploitent les pleines capacités de cet IDE. C’est donc sur ce créneau que s’est placée la conférence de Charles Desneuf.\nEn prenant comme exemple un code à propos de burritos, il a dévoilé une partie des fonctionnalités puissantes de PhpStorm : la factorisation, les templates de code, les raccourcis, et bien plus encore. Autant de fonctionnalités méconnues et sous-exploitées, mais qui, une fois maîtrisées, permettent de gagner un temps précieux.\nLa conférence a ouvert les yeux sur le potentiel de productivité que peut offrir notre IDE préféré. Une invitation à explorer plus avant les capacités cachées de PhpStorm pour optimiser notre flux de travail au quotidien.\nSadetdin Eyili — La mutabilité m’a tué, l’immutabilité m’a sauvé # Jour 2 Immutabilité Dates Wolverine était-il mutable ou immutable ? C’est une question à laquelle Sadetdin Eyili aurait très certainement pu répondre lors de sa conférence.\nAttention aux dates L’immutabilité, souvent mal comprise, se révèle pourtant essentielle pour consolider notre code, particulièrement lors de la manipulation de dates – une source inépuisable de résultats inattendus pour nombre d’entre nous.\nSadetdin a su captiver son public en exposant des situations concrètes, illustrant l’importance de l’immutabilité et partageant des exemples pertinents sur la manière de l’implémenter.\nNote spéciale à l’humour du conférencier, qui aura donné quelques rires francs dans la salle !\nThomas Dutrion — Open/Closed principle : on a dit étendre pas extends ! # Jour 2 SOLID Design patterns Lors de sa conférence Thomas Dutrion a mis en lumière l’une des lettres clés de l’acronyme SOLID : le “O”, pour Open/closed principle. Soit le fait que notre code doit être fermé à la modification directe, mais ouvert à l’extension.\nMais qu’entendons-nous exactement par “extension” ? Thomas a apporté des précisions, écartant certaines idées répandues, encore trop souvent enseignées dans les formations. Il a abordé des concepts tels que les design patterns et les décorateurs, offrant une nouvelle perspective sur la manière d’étendre notre code tout en respectant ce fameux “O” de SOLID.\nLa conférence a incité les participants à approfondir leurs connaissances. Un appel à repenser la manière dont nous concevons l’extension de notre code, dans le respect de certains principes fondamentaux de la programmation.\nLa conférence de Thomas fut la dernière à laquelle j’assistais. L’horaire de mon train et la fatigue ne m’ayant pas permis d’assister à celles de l’après-midi, que je visionnerai plus tard sur YouTube une fois celles-ci mises en ligne.\nForum PHP 2023 — Le mot de la fin # Voilà, le Forum PHP 2023 est déjà terminé ! Ce Forum s’est révélé une fois de plus être une source d’enrichissement, d’inspiration et un moment agréable partagé entre collègues ou auprès de nouvelles rencontres.\nJe tiens à exprimer ma profonde gratitude envers l’AFUP et ses bénévoles pour l’organisation de cet événement, ainsi que pour tous les autres événements organisés tout au long de l’année, qui font vivre la communauté PHP en France.\nJe vous encourage vivement à promouvoir l’AFUP autour de vous, à soutenir financièrement l’association en devenant membre ou à contribuer en tant que bénévole ou speaker lors des prochains événements. Chacune de ces actions contribue au dynamisme et à l’épanouissement de la communauté et de l’association.\nEnfin, un grand merci également à mon entreprise, AKAWAKA, qui nous permet de participer à de tels événements quand on le souhaite !\nDu code PHP plus robuste, testé et maintenable ? Tests, principes SOLID, performance des bases de données, Symfony UX : nos experts Symfony vous aident à faire évoluer vos applications en toute sérénité. Découvrir notre expertise Symfony ","date":"20 janvier 2023","externalUrl":null,"permalink":"/le-forum-php-2023-a-disneyland/","section":"Actualités","summary":"","title":"Le Forum PHP 2023 à Disneyland","type":"posts"},{"content":" Lors de l’API Platform Conference, notre équipe a eu la chance de plonger au cœur de l’univers d’APIP. Cette conférence a été l’occasion de découvrir les dernières avancées, les tendances émergentes et les meilleures pratiques en matière de développement d’API. Au fil de ces journées intenses, nous avons assisté à des conférences exceptionnelles animées par des orateurs non moins exceptionnels, nous permettant ainsi de repartir avec une mine d’informations précieuses pour améliorer nos projets clients. Dans cet article, nous souhaitons vous faire un retour de quelques conférences qui nous ont marqués.\nKévin Dunglas — Keynote d’ouverture # Keynote FrankenPHP Performance L’introduction de cette API Platform Conference par Kévin Dunglas se concentre sur la présentation d’une solution afin d’améliorer l’expérience de développeur PHP et Symfony.\nLes limites de l’architecture PHP classique # Le monde de PHP et son architecture classique se composent d’au moins deux services, le serveur web (Apache/Nginx) et PHP-FPM qui vient permettre d’avoir plusieurs processus. PHP est un langage (très) rapide parmi ses concurrents malgré son fonctionnement en fire-and-forget. Lorsqu’une requête arrive, Symfony va préparer le kernel, l’injection de dépendances, lier les services…\nAutres soucis, PHP n’est pas fait pour du temps réel ou des processus de longue durée, les solutions front à ces problématiques (souvent des SSE et websocket) ne fonctionnent pas en osmose avec PHP. Les nouvelles fonctionnalités HTTP, telles que les early hints, ne sont pas supportées immédiatement. Les early hints permettent d’avertir par une réponse 103 que certaines ressources statiques peuvent être téléchargées en avance. Les gains de perf qu’il nous remonte indiquent 60 % en moyenne. La multitude de services existants rend la Dockerisation des services plus complexe à gérer de par la multitude de solutions à déployer.\nFrankenPHP, la réponse # FrankenPHP, qui vient combler l’intégralité de ces soucis, est un serveur web basé sur Go qui intègre Caddy et Mercure (deux produits en Go). Caddy évolue rapidement, suit les nouveautés HTTP et bénéficie de support. Mercure permet lui du temps réel en suivant un standard très performant. FrankenPHP est livré via un binaire, il ne se compose que de lui-même et solutionne les soucis de performance grâce à un système de worker, similaire à Swoole, RoadRunner, etc.\nLe mode worker # Un worker va tourner sur le long terme, conserver un Symfony initialisé et prêt à traiter les requêtes, en passant les variables globales $_GET, $_POST, etc., puis en rendant la réponse.\nEn chiffres Le facteur d’amélioration est mesuré à x3 sur une démo de Symfony, le gain étant plus important si l’application utilise beaucoup d’injection.\nSon usage est simplifié au sein de Symfony grâce à Symfony Runtime, un adaptateur est déjà disponible. Depuis la conférence, l’usage est d’autant plus simple puisqu’une simple commande Docker permet de lancer un projet PHP.\nI\u0026#39;m pushing the #FrankenPHP developer experience even further: run `./frankenphp php-server` in a directory containing PHP scripts and you\u0026#39;ve got a production-level server for your applications.\nPowered by @caddyserver!https://t.co/0cQjfQReHG\n\u0026mdash; Kévin Dunglas (@dunglas) October 3, 2023 Mise en route et limites connues # Let’s Encrypt est aussi intégré et permet d’obtenir un certificat SSL autorenouvelé. Puisque ce service fonctionne seul, Docker Compose n’est pas nécessaire (si l’on n’a pas besoin d’une base de données). Disponibles en PHP 8.2 pour l’instant, (presque) toutes les extensions PHP sont disponibles dans un Dockerfile.\nLimites connues Il existait au moment de la conférence trois soucis connus : les fibers qui nécessitent une modification d’usage, l’extension native imap qui n’est pas compatible, et Doctrine qui ne fonctionne pas correctement sur le long terme dans les projets FrankenPHP, Swoole, RoadRunner… (voir l’issue Symfony).\nTout juste sorti d’alpha, FrankenPHP est désormais disponible via sa première bêta et il respecte le versionnement sémantique (semver).\nDéjà utilisé en production, nous sommes impatients de l’essayer afin de délivrer des applis toujours plus performantes.\nXavier Leune — API Platform, open data et schemaless # Open data MariaDB ETL Nous vivons en France l’expansion de l’open data, d’abord initiée par la ville de Rennes ; Paris a suivi avant que l’État généralise cette mouvance. CCMBenchmark, représenté par Xavier Leune, a créé une plateforme basée sur l’open data, elle se veut transparente, honnête et avec une volonté de partage. Plusieurs médias composent CCM et sur de multiples thématiques (Le Journal des Femmes, JDN, Droit-Finances.net, L’Internaute).\nLeur projet s’est basé sur API Platform avec MariaDB, la donnée qu’ils traitent est gigantesque et l’ingestion de ces dernières est le sujet qui leur demande le plus de travail. Ils ont développé pour leur besoin un ETL en PHP déployé sur 35 machines, il ingère la donnée depuis une solution de stockage maison avant de l’injecter dans MariaDB. Leurs clients (web) qui consomment la donnée vont alors chercher la donnée au sein de ces bases de données.\nEn chiffres Leur solution de stockage contenait 600 millions de lignes et MariaDB porte 580 Go de données. Lors d’événements publics (type résultat des élections, brevet, bac) des pics sont constatés, en moyenne 60 millions de pages vues.\nLes données qui passent dans l’ETL sortent en XML, dans un format exploitable directement. Afin d’être flexibles dans leur stockage, ils implémentent le pattern EAV : une table est une entité, l’autre est la valeur associée à cette entité. L’inconvénient majeur de cette solution est l’usage de jointures, les optimisations du SGBD sont donc faibles.\nCes données peuvent aussi évoluer, par exemple la popularité des prénoms est basée sur la somme de valeurs dans une plage donnée. Le calcul se fait lors de l’ingestion, le traitement prend environ 36 heures. Lors des élections, bien que les résultats soient disponibles immédiatement, les statistiques sont calculées en même temps.\nLeurs objectifs # Une ingestion rapide Un modèle scalable et performant Plus de duplication de données 0 développement lors de nouvelles données Cette conférence très intéressante et hors norme nous montrera comment ils ont fait pour atteindre leurs objectifs tout en respectant les standards d’API Platform.\nAlexandre Salomé — Developing an API without API Platform # Retour d’expérience NelmioApiDocBundle Architecture Alexandre Salomé, à travers son retour d’expérience, veut nous rappeler comment on pouvait faire des API à l’époque où API Platform n’était pas encore la référence d’aujourd’hui.\nIl y a 4 ans, lorsqu’il fait sa veille technique pour son projet d’API, il a le souhait d’avoir également une documentation de cette API pour simplifier ses intégrations. Pour la documentation, il se tourne vers l’utilisation de Swagger Editor. Pour l’implémentation de l’API, il teste API Platform, crée les modèles de son API et bien vite, se confronte au premier problème : au lieu d’avoir des identifiants numériques, il obtient des IRI, ce qui bloque beaucoup l’intégration de leur API. En effet, c’était assez déroutant il y a 4 ans de ne pas pouvoir utiliser des identifiants pour requêter une API. Autre problème, il doit écrire beaucoup de code pour écrire la documentation qui sera générée par APIP.\nAu final, il abandonne l’utilisation d’APIP et préfère une implémentation plus pragmatique.\nUne implémentation « à la main » # Pour la documentation il utilise NelmioApiDocBundle et ajoute des commentaires dans ses contrôleurs pour alimenter la documentation. Il se retrouve assez vite avec beaucoup de logique similaire dans ses contrôleurs : de la désérialisation de données JSON, de la validation de ces données, puis le renvoi de la réponse avec de la sérialisation.\nAinsi il refond son code tel que :\nIl crée un ViewListener pour encapsuler la sérialisation de la réponse. Il peut donc juste renvoyer la donnée depuis le contrôleur, l’écouteur faisant la création de la réponse Symfony. Il déplace les données de la requête dans un DTO. Il crée un ModelResolver permettant de désérialiser la donnée, dans le but d’avoir un objet exploitable dans son contrôleur. Il gère les diverses erreurs de validation pour fournir une réponse avec un bon code HTTP via un ValidateListener qui vient écouter les erreurs type de Symfony pour réécrire le statut de la réponse et également le format des erreurs pour une intégration plus facile pour les fronts. Il ajoute un écouteur CORS, qu’il préfère à l’utilisation de NelmioCorsBundle, toujours dans une idée d’être pragmatique, leur besoin était extrêmement simple. En avançant comme ceci, il se retrouve avec une version 0.1 qu’il faudra bien vite améliorer les mois suivants, en ajoutant :\nLa création d’un manuel utilisateur avec des instructions générales de comment s’authentifier, les fonctionnalités de chaque route (en plus du Swagger), etc. La création d’un SDK JavaScript pour l’utilisation de l’API La création d’une API d’administration Etc. Le bilan, 4 ans après # Au bout de 4 ans, le bilan devient vite mitigé sur leurs choix initiaux de ne pas utiliser APIP. Leur API se retrouve bloquée avec l’incapacité de gérer d’autres formats que JSON. Il y a une difficulté à ajouter des fonctionnalités compliquées, autres que du simple CRUD. Et pratiquement pas d’outillage standard, obligeant à développer des outils à la main.\nLe verdict Alexandre conclut qu’aujourd’hui, il ne referait plus le même choix et n’hésiterait pas à utiliser API Platform car c’est une solution permettant le multiformat, la pagination, un SDK JavaScript, etc. et c’est un meilleur choix que de tout refaire à la main. C’est aussi s’ouvrir à l’ajout de nouvelles fonctionnalités qui peuvent être utiles comme Mercure pour du temps réel, Vulcain, etc.\nMathias Arlaud — Subresources, the easy way # Subresources API Platform 3 Mathias Arlaud a décidé de nous parler de la coupe du monde de rugby pour illustrer sa conférence. À travers plusieurs exemples habilement trouvés, il nous explique ce que sont les Subresources d’API Platform et quand les utiliser.\nCe qui change avec la v3 On apprend que les Subresources ont bien évolué avec la version 3 d’API Platform. Anciennement elles ne pouvaient être utilisées qu’en lecture seule, alors qu’aujourd’hui on peut leur appliquer des opérations de modification, suppression, etc.\nEn plus de ça, Mathias nous explique comment bien configurer nos Subresources pour éviter les soucis d’over-fetching.\nSmaïne Milianni — Remplacer une base de données par une API sans toucher l’existant, mission impossible ? # Migration E-commerce Synchronisation Pendant sa conférence, Smaïne Milianni nous explique comment il a dû remplacer une base de données par une API dans un projet e-commerce. Au programme : de l’écriture d’informations dans plusieurs bases de données, des problèmes de synchronisation à gérer, et surtout une application qui fonctionne encore quelques années après une migration progressive toujours en cours. Tant d’aventures racontées avec une belle touche d’humour.\nBastien Jaillot — Une histoire d’épouvante qui finit bien : récit d’une migration d’une API custom vers API Platform 2.x puis 3 # Migration API Platform 3 Blackfire Bastien Jaillot nous explique comment il a vécu les mises à jour d’API Platform vers la version 3. Après avoir corrigé toutes les erreurs, les plus évidentes induites par des erreurs de codage, via l’outil Blackfire, il explique comment chaque montée de version d’APIP arrive avec son lot de problèmes qui ont joué sur les performances de leur application.\nIl détaille précisément chaque problème rencontré et comment il les a corrigés, tout en améliorant le projet APIP en contribuant, pour tous et pour leur application.\nSi au début il critique l’aspect très figé d’APIP dans ses premières versions, il finit par saluer les ajouts permettant plus de personnalisation avec les Provider et Processor.\nLa leçon Il conclut en disant que sans tests fonctionnels, il n’aurait pas pu faire ces migrations et également que c’est en contribuant au projet APIP qu’on permet à d’autres d’éviter tous ces déboires.\nUne API à concevoir ou à migrer vers API Platform ? Conception d’API, montée de version d’API Platform, performance avec FrankenPHP : nos experts Symfony vous accompagnent de bout en bout. Découvrir notre expertise Symfony ","date":"6 janvier 2023","externalUrl":null,"permalink":"/lapi-platform-conference-2023-a-lille/","section":"Actualités","summary":"","title":"L’API Platform Conference 2023 à Lille","type":"posts"},{"content":"","date":"8 janvier 2023","externalUrl":null,"permalink":"/tags/cms/","section":"Tags","summary":"","title":"CMS","type":"tags"},{"content":"","date":"8 janvier 2023","externalUrl":null,"permalink":"/tags/prismic/","section":"Tags","summary":"","title":"Prismic","type":"tags"},{"content":"","date":"8 janvier 2023","externalUrl":null,"permalink":"/tags/strapi/","section":"Tags","summary":"","title":"Strapi","type":"tags"},{"content":" Nous sommes en 2023, il existe de nombreux CMS Headless qui peuvent répondre à vos besoins. Il est alors facile de se perdre dans toute cette documentation, ces comparatifs et guides, surtout lorsque les besoins ne sont pas clairement identifiés. Parce qu’à la problématique : Strapi et Prismic, comment choisir la meilleure solution ? Je vais citer la réponse que vous connaissez déjà : ça dépend. CMS Headless Système de gestion de contenu (Content Management System) qui se concentre sur la gestion et le stockage du contenu (et du back-end globalement) laissant le choix libre concernant les technologies à utiliser pour le front-end.\nPrenons le temps de la réflexion : avant de nous lancer, il peut être judicieux de savoir pourquoi vous pourriez préférer un CMS Headless à un CMS traditionnel, et inversement.\nLes CMS Headless ont gagné en popularité ces dernières années par leur flexibilité et leur scalabilité notamment, mais selon votre projet, peut-être que vous préférerez un CMS traditionnel. Il n’en sera cependant pas question dans cet article.\nScalabilité Faculté d’un produit, d’un logiciel ou d’une application à s’adapter aux fluctuations de la demande et du marché, tout en conservant ses fonctionnalités de base.\nLa multitude de solutions peut vite déboussoler les personnes qui n’ont jamais touché à ces solutions, alors comment faire le bon choix ? Tout commence par l’identification claire de vos besoins.\nIdentifier les besoins # Cadrage Stratégie de contenu Avant de commencer à lire tous les articles et comparatifs de CMS que vous allez trouver, posez-vous certaines questions :\nQuels sont les objectifs du site / de l’application ? (Vente en ligne, blog, plateforme éducative, etc.) Quel est le budget ? Qui sont les utilisateurs finaux ? Quelle est la stratégie de contenu ? Concernant la stratégie de contenu, il faut se demander : quel est son but (éducatif, engageant…), quels types de contenus seront créés, quels seront les canaux de distribution (où sera publié le contenu), comment ce dernier sera maintenu et actualisé, etc.\nD’autres questions peuvent ensuite s’ajouter à la liste, comme :\nQuel est votre niveau de compétences techniques ? Si vous êtes novice, vos choix vont se porter sur des solutions avec des interfaces intuitives par exemple. Quelle importance est-ce que vous accordez à la personnalisation ? Est-ce que vous allez réaliser ce projet seul·e ou bien de façon collaborative ? À retenir Vous l’avez compris, la liste de questions à se poser peut vite devenir impressionnante. La sélection sera moins compliquée une fois les besoins clairement déterminés.\nFaire connaissance avec les outils # Strapi # Open source Node.js Auto-hébergé Strapi est un CMS open source auto-hébergeable construit avec Node.js et qui propose une architecture back-end basée sur Express. Il permet de créer une intégration de contenu personnalisable, performante et est doté d’une API.\nOpen source software (OSS) Logiciel dont le code est mis à disposition du public, ce qui encourage la transparence et la collaboration dans les communautés de développeurs·ses.\nIl est optionnellement encadré par une licence dans laquelle le détenteur du droit d’auteur accorde aux utilisateurs le droit d’utiliser, d’étudier, de modifier et de distribuer le logiciel et son code source à quiconque et à n’importe quelle fin.\nIl permet de créer des modèles de données avec des relations personnalisées entre les contenus. Par exemple, pour la création d’un blog, on peut créer des modèles de données comme “Article” et “Auteur” et faire en sorte que chaque article soit lié à un auteur spécifique. Il est aussi possible de créer d’autres “liens”, d’autres relations telles que des catégories d’articles pour organiser le contenu. En d’autres mots, il s’agit de façonner la structure du contenu de manière à répondre aux besoins du projet.\nOutre sa flexibilité, Strapi offre un éditeur WYSIWYG (What You See Is What You Get) pour simplifier la création et la modification de contenu, ce qui peut être particulièrement utile pour les rédacteurs.\nCette solution profite d’une grande extensibilité de par sa communauté active (sur Discord par exemple). De plus, de nombreux plugins sont disponibles et visualisables via l’interface générée lors de la création de votre projet.\nStrapi permet aussi un travail collaboratif avec ses fonctionnalités de contrôle d’accès et de gestion des rôles, tout comme Prismic.\nPrismic # SaaS Slice Machine Next.js / Nuxt En ce qui concerne ce dernier, Prismic se focalise sur la gestion de contenu en fournissant un cadre structuré. Contrairement à Strapi, il offre moins de personnalisation et propose des types de contenu prédéfinis. En tant que SaaS offrant une API de gestion de contenu, Prismic propose notamment un outil intéressant nommé Slice Machine, qui fonctionne avec les technologies Next.js et Nuxt 2 \u0026amp; 3.\nSaaS (Software as a Service) Solution logicielle applicative hébergée dans le cloud et exploitée en dehors de l’organisation ou de l’entreprise par un tiers (fournisseur de service).\nSlice Machine en quelques mots # Slice Machine est un outil de développement local qui permet de construire des modèles “types” et des “Slices” de façon synchronisée entre votre codebase et votre repository Prismic.\nLes types font référence à la structure globale des différents contenus / pages dans l’application. Chaque type représente un modèle de contenu spécifique. Quant aux Slices, ce sont des éléments modulaires et réutilisables : cela permet de diviser les contenus en sections avec leur propre structure.\nCet outil place vos modèles de contenu directement dans votre code, faisant ainsi de votre code la source de vérité pour vos structures de données.\nGrâce à Slice Machine, vous pouvez gérer les versions et simuler localement vos modèles de contenu.\nSource of truth “Source of truth” (source de vérité) est une expression utilisée pour désigner la source la plus fiable et la plus à jour d’informations ou de données dans un système.\nComment faire votre choix ? # Nous y voilà, la fameuse question. Lorsqu’il s’agit de choisir, ici entre Strapi et Prismic, il y a quelques points à considérer et il s’agit plus ou moins de relier les points évoqués plus haut.\nEn un coup d’œil # Critère Strapi Prismic Modèle Open source, auto-hébergé SaaS, hébergé dans le cloud Complexité technique Compréhension de Node.js et Express utile pour les personnalisations avancées Probablement plus intuitif pour les débutants Personnalisation Approfondie Plus structurée, modulaire, “clés en main” Hébergement Contrôle total sur l’environnement et les ressources Géré par Prismic, contrôle direct limité Accès aux données Contrôle total sur la base de données et les opérations CRUD Via l’API de Prismic Complexité technique # Strapi, en raison de sa personnalisation, peut nécessiter une meilleure compréhension des frameworks JavaScript tels que Node.js et Express, tandis que Prismic est probablement plus intuitif pour les débutants.\nStrapi propose une interface admin qui permet de “tout” gérer (modèles de données, relations des contenus, etc.) et vous pourriez avoir besoin de manipuler le code de l’API, par exemple pour définir certains endpoints, pour gérer des autorisations, etc. Dans ces cas-là, une compréhension de Node.js et Express peut s’avérer nécessaire. Ça ne veut pas dire qu’il faut maîtriser ces technologies pour utiliser Strapi, mais pour des personnalisations avancées, c’est un plus.\nFlexibilité et personnalisation (décidément) # Comme nous venons de le voir, Strapi est une bonne solution pour une personnalisation approfondie, mais si par contre vous cherchez une solution plus structurée, modulaire et un peu “clés en main”, votre choix se porterait peut-être plus sur Prismic.\nTaille du projet # Plus un projet est vaste, plus il peut nécessiter une gestion efficace de la scalabilité. Dans ce cas-là, Strapi pourrait offrir plus de possibilités, en raison de son auto-hébergement.\nPrismic propose une solution hébergée dans le cloud, donc l’infrastructure d’hébergement est gérée par Prismic et cela peut simplifier le processus de déploiement pour les utilisateurs qui ne souhaitent pas gérer leur propre infrastructure, mais le niveau de contrôle direct sur l’environnement d’hébergement est donc limité.\nStrapi quant à lui, en étant auto-hébergé, peut être déployé sur vos propres serveurs et vous avez un contrôle total sur l’environnement d’hébergement ainsi que la capacité à ajuster les ressources en fonction des besoins du projet et de la charge (par exemple dans le cas où il y a un grand nombre d’utilisateurs actifs).\nAccès aux données # Avec Strapi, vous avez un contrôle total sur la base de données et les données stockées. Vous avez la liberté de choisir la base de données qui convient le mieux à votre projet (par exemple MongoDB, MySQL, etc.) et de définir la structure des modèles de données en fonction de vos besoins. Dans le cadre de Strapi, vous avez également la mainmise sur les opérations CRUD (Create, Read, Update et Delete). Cette flexibilité vous permet de personnaliser et de mettre en place des opérations spécifiques pour manipuler les données conformément aux exigences de votre projet.\nD’un autre côté, Prismic adopte une approche différente pour l’accès aux données. Vos contenus sont stockés dans le cloud, et vous interagissez avec eux via une interface déployée dans le cloud. Vous accédez aux données en interrogeant l’API de Prismic à l’aide de requêtes.\nConseils pratiques pour la prise de décision # Une fois vos besoins, vos critères et vos scénarios définis, libre à vous d’expérimenter et de vous faire votre propre avis sur les outils disponibles. Vous pourrez tester leur fonctionnement, leur intégration à votre projet. Consulter les différentes communautés peut aussi vous aider : lisez les retours d’expérience d’autres utilisateurs, car ils ont eu à se poser les mêmes questions que vous.\nÇa dépend Comme vous l’avez compris, ce choix dépend tellement des spécificités de votre projet et de vos préférences techniques que je ne pourrais pas vous donner une réponse qui conviendra à tout le monde et tout le temps. Toutes ces solutions ont des avantages et des inconvénients et répondent à des besoins spécifiques. En prenant tout cela en compte, vous pourrez choisir la solution qui vous convient le mieux pour tel ou tel projet.\nRessources # Documentation # Documentation de Strapi Documentation de Prismic Tutoriels et guides # SvelteKit 1.0 Crash Course – Full Tutorial with Prismic Getting started with Strapi v4 Strapi blog Communauté Prismic Besoin d’aide pour choisir et intégrer votre CMS ? Cadrage des besoins, choix de la solution, intégration headless ou traditionnelle : nos experts vous aident à faire le bon choix pour votre projet. Découvrir notre offre de conseil ","date":"8 janvier 2023","externalUrl":null,"permalink":"/strapi-et-prismic-comment-choisir/","section":"Actualités","summary":"","title":"Strapi et Prismic, comment choisir ?","type":"posts"},{"content":" Le vendredi 12 mai, l’AFUP Day 2023 a eu lieu à l’Université Catholique de Lille. Deux membres d’AKAWAKA ont assisté à cet événement. Retour d’expérience pour Valentin Silvestre et Loïc Frémont. Grégoire Pineau — Doctrine, objet typé et colonne JSON # Doctrine JSON CMS Nous verrons ici l’exemple d’une fonctionnalité semblable à un CMS. Basé sur un système de blocs de contenu, ils comportent beaucoup de champs en commun. L’usage de Doctrine et de ses systèmes d’héritage nous est montré.\nAvec ces cinq objectifs, la direction du talk est donnée :\nÉviter la duplication de code Pouvoir stocker les blocs en base de données Avoir au maximum des objets PHP Et si possible un objet par type de bloc Avoir un système performant Grégoire Pineau nous montre sa solution qui, grâce aux types custom de Doctrine, répond à ces problématiques.\nDe l’implémentation du JSON type jusqu’à l’Unit of work, cette présentation est une belle démonstration de l’usage de Doctrine.\nCharles Desneuf — Tester du legacy grâce à l’Approval testing # Tests Legacy Live coding Charles Desneuf présente l’Approval testing : à travers son outil, il montre comment récupérer et comparer le résultat d’un process.\nDans des cas complexes, il montre dans une session de live coding comment falsifier la métadonnée pour s’assurer du fonctionnement d’un code legacy avant son évolution.\nLe point fort Le plus impressionnant restera la création de matrice de test pour générer les tests et obtenir un taux de couverture élevé en toute simplicité.\nAntoine Bluchet — PHP dans le navigateur pour documenter API Platform # WebAssembly API Platform Documentation Nous avons eu ici une démonstration technique impressionnante de WASM, qui permet de compiler d’autres langages que le JavaScript pour le navigateur.\nUn grand tour d’horizon de la technologie, de son fonctionnement et de son utilisation. La compilation des assets sera importante afin de pouvoir utiliser le cache des navigateurs.\nEn chiffres Bonus, le cache Symfony est conservé à travers la navigation, seulement 60ms pour afficher la page d’accueil Symfony !\nLes cas d’usages nous paraissent en revanche rares, mais pas inexistants. Nous avons notamment pu imaginer de la documentation clef en main ou encore des outils de formation. Plus de soucis d’environnement pour les apprenants !\nPHP WASM code and demo at https://t.co/syDf5lWnck\nSlides: https://t.co/mKGWOYMGoB\nNext time I’ll stay longer! Thanks @afup for everything!\n— soyuka (@s0yuka) May 12, 2023\nAllison Guilhem — Groupement des messages sur Symfony Messenger # Symfony Messenger Batch Encore une superbe conférence ici donnée par Allison Guilhem. En débutant par un tour d’horizon du traitement des messages par la librairie, nous voyons ensuite pourquoi le traitement par défaut ne répond pas à tous les besoins.\nLe traitement par lot sera abordé ainsi que l’historique de cette fonctionnalité à travers le temps et les PR. Sans nul doute que nous utiliserons cette fonctionnalité au sein d’un projet.\nKévin Dunglas — Protection contre les attaques logistiques avec Composer # Sécurité Supply chain Composer Mitigate Attacks on your #PHP Supply Chain: https://t.co/xAl8HEnBDN #AFUPDay pic.twitter.com/Ws2f5cATLF\n— Kévin Dunglas (@dunglas) May 12, 2023\nReprise de la conférence après un super repas, Kévin Dunglas nous donne une “conférence digestive”. Ici pas de code, rien de trop complexe. Uniquement la notion Supply chain, l’historique des soucis ayant déjà existé chez d’autres technologies et pourquoi nous sommes un peu plus épargnés.\nPHP est plus épargné que JavaScript ne serait-ce que par son écosystème. En moyenne, le nombre de packages d’un projet PHP basé sur Composer est moindre que celui d’un projet JavaScript. La popularité de JavaScript est aussi un facteur qui le rend plus attractif pour les attaquants.\nSécurité On y apprend plusieurs types d’attaques et comment se protéger dans l’écosystème au niveau de Composer. Sa proposition est d’établir une liste de vendors que chacun juge “safe” et que les nouveaux paquets utilisés soient vérifiés manuellement lorsqu’une nouvelle dépendance tierce (transitive dependency) est nécessaire.\nOlivier Mairet — ApiTester et automatisation des tests # OpenAPI Tests Olivier Mairet nous présente ici ApiTester, une solution qui permet d’exploiter au maximum OpenAPI pour générer automatiquement un nombre impressionnant de tests de vos endpoints.\nC’est une solution qui semble intéressante et qui sera à essayer par nous-mêmes au sein d’un projet.\nOlivier nous a promis que le package sera disponible en open-source prochainement.\nGina Peter Banyard — Gestion d’erreur # Gestion d’erreur Monad Une conférence très intéressante et intelligente nous a été présentée par Gina Peter Banyard.\nÀ travers un exemple concret, elle nous montre comment gérer les erreurs dans un projet en chaînant les appels de fonctions… Pour aboutir au pattern Monad dans un usage réel.\nPHP n’étant pas conçu pour que ce pattern existe, elle nous montrera comment néanmoins l’intégrer. Un sujet peu simple et pourtant qu’on aura compris. En partie.\nLaura Durieux — Où sont passées les femmes de l’histoire de la tech ? # Coup de cœur Histoire Diversité Les slides de ma conférence de vendredi pour @afup sont en ligne 👉 https://t.co/4lEXAqhEha\n— Laura Durieux (@devgirl__) May 14, 2023\nLa conférence qui nous aura le plus intéressés et de loin. Laura Durieux nous présente ici un sujet qui retrace la place des femmes dans l’informatique moderne.\nJe pensais en connaître, mais j’ai été surpris de voir que je ne connaissais que très peu de femmes ayant participé à l’histoire de l’informatique.\nDe cette conférence je n’en retiendrai malheureusement pas de nom, mais des faits. Et afin de retenir les noms, j’ai sauvegardé les slides précieusement.\nUn projet PHP ou Symfony à fiabiliser ? Tests sur du legacy, Messenger, sécurité des dépendances : nos experts Symfony vous accompagnent sur vos projets PHP. Découvrir notre expertise Symfony ","date":"16 janvier 2023","externalUrl":null,"permalink":"/afup-day-lille-2023/","section":"Actualités","summary":"","title":"AFUP day Lille 2023","type":"posts"},{"content":" L’équipe AKAWAKA était au Forum PHP 2022 à Disneyland Paris. Retour sur les conférences qui nous ont le plus marqués, avec pour chacune le replay vidéo. Thibault Richard (Wid’op) — Un moteur bien huilé # Design pattern Rule Engine Symfony Thibault Richard nous présente le design pattern Rule Engine au travers d’un retour d’expérience chez un client dans le domaine du logement social. Un client qui possède donc un métier complexe avec beaucoup de règles et de traitements différents.\nRule Engine est un système qui évalue un ensemble de règles métiers et détermine les actions à réaliser. Cela permet d’éviter les successions de if / else if dans un algorithme complexe possédant de nombreuses conditions.\nCe modèle est découpé en deux entités : les règles (Rule) et le système qui évalue ces règles, le moteur (Engine).\nAinsi, comme le présente Thibault dans un exemple d’algorithme chargé de lister une collection de documents administratifs à fournir par un demandeur selon ses critères de nationalité, de situation professionnelle, etc. :\nExemple : algorithme conditionnelpublic function getDocuments(User $user): array { $documents = []; if ($user-\u0026gt;isFrench()) { $documents[] = new Document(\u0026#39;pièce d\\\u0026#39;identité\u0026#39;); } else { $documents[] = new Document(\u0026#39;titre de séjour\u0026#39;); } if ($user-\u0026gt;isEmployee()) { ... } } On peut facilement transformer chaque if en une règle métier telle que :\nIdentityRule.phpclass IdentityRule implements RuleInterface { public function when(User $user): bool { return $user-\u0026gt;isFrench(); } public function then(User $user): Document { return new Document(\u0026#39;Pièce d\\\u0026#39;identité\u0026#39;); } } Enfin, il restera à créer la classe DocumentEngine prenant en paramètre la liste des règles dans un tableau, puis itérer sur chaque règle pour vérifier si lorsque when retourne vrai, alors on appelle then, le traitement de la règle – dans notre exemple si le demandeur est Français, la règle retourne la demande de document “Pièce d’identité”.\nAvec Symfony Thibault nous dévoile comment avec Symfony, il est arrivé facilement à brancher ses règles avec ses moteurs via l’injection de dépendance par tag. Il suffit de taguer les règles puis de les injecter dans un itérateur avec tagged_iterator, voir la documentation Symfony pour en savoir plus.\nNotre mise en pratique chez AKAWAKA # Cette conférence tombe à pic pour nous chez AKAWAKA. En effet, nous avons actuellement un client qui veut refondre un intranet BtoB possédant un métier très complexe avec beaucoup de conditions.\nNous avons tout naturellement repris ce modèle, cependant, en allant un peu plus loin dans l’implémentation. Nous avons en plus inclus le design pattern spécification qui isole le if dans une classe dédiée, ce qui permet de réutiliser cette condition partout dans notre application.\nEnfin, nous avons ajouté du log informatif dans nos moteurs, permettant de suivre les règles qui s’appliquent ou celles qui sont ignorées. Dans un contexte de refonte d’une application vieillissante, cela nous permettra d’identifier les règles qui sont très peu, voire jamais appelées.\nWhenUserHasFailureStatus.phpclass WhenUserHasFailureStatus implements RuleInterface { public function __construct( private DoUserHasFailureStatusInterface $doUserHasFailureStatus ) {} public function when(User $user): bool { return $this-\u0026gt;doUserHasFailureStatus-\u0026gt;isSatisfiedBy($user); } public function then() { ... } } AbstractEarlyRuleEngine.phpabstract class AbstractEarlyRuleEngine implements RuleEngineInterface { private iterable $rules = []; private InstrumentationInterface $instrumentation; public function __construct( iterable $rules, InstrumentationInterface $instrumentation ) { $this-\u0026gt;rules = $rules; $this-\u0026gt;instrumentation = $instrumentation; } /** * @throws RuleEngineException * @throws RuleException */ public function __invoke($subject) { $this-\u0026gt;instrumentation-\u0026gt;start($this); /** @var RuleInterface $rule */ foreach ($this-\u0026gt;rules as $rule) { if ($rule-\u0026gt;when($subject)) { $this-\u0026gt;instrumentation-\u0026gt;match($this, $rule); try { $result = $rule-\u0026gt;then($subject); $this-\u0026gt;instrumentation-\u0026gt;success($this, $rule, $subject); return $result; } catch (\\Exception $exception) { $this-\u0026gt;instrumentation-\u0026gt;error($this, $rule, $subject, $exception-\u0026gt;getMessage()); throw new RuleException($exception-\u0026gt;getMessage(), $exception-\u0026gt;getCode(), $exception); } } else { $this-\u0026gt;instrumentation-\u0026gt;skip($this, $rule); } } return null; } } Avec le service Instrumentation qui va se charger de loguer les interactions en allant piocher dans nos classes de règle et de moteur du contexte via une méthode getDescription. Ce qui donne au final :\nSortie Monolog[2022-10-21T14:56:47.044789+00:00] app.INFO: security.user_verification.rule_engine.start {\u0026#34;engine\u0026#34;:\u0026#34;User verification depends specific rules\u0026#34;} [] [2022-10-21T14:56:47.044874+00:00] app.INFO: security.user_verification.rule_engine.skip {\u0026#34;rule\u0026#34;:\u0026#34;When A, then a\u0026#34;} [] [2022-10-21T14:56:47.044941+00:00] app.INFO: security.user_verification.rule_engine.match {\u0026#34;rule\u0026#34;:\u0026#34;When B, then b\u0026#34;} [] [2022-10-21T14:56:47.044998+00:00] app.INFO: security.user_verification.rule_engine.success {\u0026#34;rule\u0026#34;:\u0026#34;When B, then b\u0026#34;,\u0026#34;data\u0026#34;:{\u0026#34;user\u0026#34;:\u0026#34;00012345\u0026#34;}} [] Replay # Sarah Haïm-Lubczanski (Bedrock) — Sauve un-e dév, écris une doc ! # Documentation Diátaxis La documentation d’une application, son fonctionnement, son code a toujours été un sujet compliqué. Quoi documenter ? Comment présenter cette documentation ? Tout un tas de questions auxquelles Sarah Haïm-Lubczanski tente de répondre dans sa conférence.\nElle nous liste des conseils, des outils et des exemples très pertinents, mais aussi ce qu’il ne faut pas faire ; non, la documentation dans le code n’est pas une bonne documentation.\nElle s’appuie sur le framework Diátaxis qui range, selon le niveau de maîtrise et d’attente du lecteur, les types de documentations possibles :\nles tutoriels (orientés apprentissage) ; les guides (orientés réalisation) ; les explications (orientées compréhension) ; les références (orientées information technique). Quant à la forme, des outils permettent de savoir comment bien présenter et tenir une documentation, tels que Write the Docs qui est une documentation sur la manière d’écrire de la documentation, ou bien readme-checklist qui est une checklist aidant à bien rédiger votre README.\nEnfin, elle nous prévient cependant que vouloir faire des documentations dynamiques avec une UX avancée à la Stripe demande du temps et des ressources. Chez Stripe, c’est une équipe de 30 développeurs / rédacteurs qui sont à l’œuvre. De plus, une documentation, ça doit être chéri. Il faut la garder à jour, l’enrichir d’exemples, d’images et de schémas quand c’est pertinent.\nEn bref En bref, une bonne documentation est un outil qui fait gagner du temps, mais il faut respecter quelques règles pour que celle-ci soit utile. Alors pourquoi ne pas prendre tout de suite les bons réflexes ?\nReplay # Pierre Tondereau (Mention) — Une extension PHP rouillée # Rust Extension PHP Redis Dans cette conférence, Pierre Tondereau nous présente un REX de création d’extension en Rust.\nDe par ses grandes performances (proches du C) et sa syntaxe digne d’un langage de haut niveau, Rust est un allié de choix.\nIl intègre sur son projet la gestion d’algorithme redlock sur Redis via une extension qu’il a conçue : ext-redlock-php. PHP grâce au FFI peut exécuter du C et donc du Rust.\nL’intégration est simplifiée pour les extensions grâce à ext-php-rs. Ce package a pour but de rendre la création d’extension plus simple grâce à la documentation fournie de Rust, ses fonctionnalités modernes, tout en permettant une gestion plus large de versions PHP. Puisque le code Rust est transformé, il va être capable de fonctionner en versions PHP plus anciennes et futures selon le support de l’extension.\nReplay # Mathias Arlaud (Les-Tilleuls.coop) — De l’humain à l’ordinateur, ou découvrir le sens d’un texte avec Elasticsearch # Elasticsearch Apache Lucene Recherche Mathias Arlaud nous a montré à travers sa conférence comment Elasticsearch (grâce à Apache Lucene) pouvait, à partir d’un simple mot, effectuer une recherche intelligente sur tout un ensemble de documents.\nCette équation peut faire peur, mais Mathias a su nous l’expliquer en la simplifiant sous la forme :\nSd = (TF × IDF) × C\nOù :\nTF représente le termFrequency. C’est-à-dire le nombre de fois où le mot recherché est présent dans les documents stockés dans Elasticsearch. IDF représente l’inverseDocumentFrequency, qui va déterminer si oui ou non le mot d’une phrase recherchée est pertinent. C représente le coordinationFactor. Ce facteur de coordination va mettre en avant les documents contenant le plus haut pourcentage de mots présents dans la phrase recherchée. Seulement cette formule ne suffit pas à obtenir des résultats pertinents. En effet, Elasticsearch va venir appliquer un traitement en trois étapes au moment de la recherche.\n1 Les filtres de caractères Ils auront la responsabilité d’ajouter, de modifier ou de supprimer des caractères de la phrase recherchée en fonction de règles prédéfinies (pattern_replace, html_strip, etc.). 2 Les générateurs de tokens La recherche Elasticsearch ne se base pas sur des mots, mais sur des token. Elasticsearch va donc utiliser des générateurs pour découper la requête en tokens. 3 Les filtres de tokens Ils vont venir agir sur ces tokens pour les modifier. Il en existe plusieurs, dont :\nstopword qui permet de supprimer tous les tokens inutiles tels que le, la, les stemmer qui va appliquer une série de règles, afin d’obtenir la forme dite “canonique” d’un token, les regroupant ainsi selon cette forme. Par exemple, si nous appliquons ce filtre aux tokens suivants : développement, développeur et développeuse nous obtiendrons développ, développ et développ. Pour conclure, Mathias Arlaud a su nous ouvrir les portes d’Elasticsearch et d’Apache Lucene pour nous montrer comment, à partir d’une “simple” équation et de quelques outils, Elasticsearch réalise ses recherches de manière intelligente.\nReplay # Amélie Abdallah (TheTribe) — Comment être bien onboardée en tant que développeuse junior reconvertie ? # Onboarding Reconversion Juniors Amélie Abdallah nous a raconté son histoire de développeuse reconvertie. À travers cette conférence, elle souhaitait faire passer un message à toutes les entreprises présentes.\nRecruter des profils en reconversion et donc junior !\nLors de son parcours pour devenir une développeuse accomplie, Amélie est passée par des obstacles :\nune entreprise pas disponible pour l’aider dans son apprentissage une pression due à sa reconversion une alternance à ne pas louper commencer à coder le premier jour sans soutien ni documentation à l’appui Pour surmonter ces obstacles, elle a décidé de changer d’entreprise et ce fut une idée qu’elle ne regretta pas. Nouvelle boîte, nouvel accueil, nouveaux collègues, nouvelle façon de faire.\nC’est là qu’elle a découvert :\nune toute nouvelle procédure d’encadrement une présentation de toute l’équipe la découverte de tous les métiers une formation complète aux bonnes manières de coder que coder le premier jour n’est pas bénéfique à l’apprentissage En conclusion, dans cette nouvelle entreprise, elle a eu tous les outils nécessaires pour débuter sa nouvelle carrière de développeuse.\nLe message Aujourd’hui, elle est épanouie dans ce qu’elle fait et elle souhaite que chaque développeur junior ait la chance d’avoir un accompagnement comme le sien.\nReplay # Pierre Pelisset (KaraFun) — FFI : de nouveaux horizons pour PHP # FFI C RS-232 C’est lors du développement de leur solution de box karaoké que Pierre Pelisset et son équipe ont été confrontés à un dilemme : continuer à utiliser une librairie Python (PySerial), qui posait des soucis techniques et n’est plus mise à jour depuis 2020 ? Ou bien utiliser pleinement PHP et ses fonctionnalités pour communiquer directement sur les ports RS-232 des box ? C’est cette seconde solution qui a été choisie et Pierre nous a présenté FFI (disponible depuis la 7.4), et fait un retour d’expérience de son usage au travers de quelques cas simples mais concrets.\nFFI permet donc de pouvoir utiliser au sein de son code PHP d’autres langages. D’exploiter leurs spécificités. Sans rentrer dans des détails trop techniques ici, il s’agit de pouvoir utiliser des bibliothèques compilées (.dll sous Windows ou .so sous Linux) en les chargeant dans notre contexte PHP grâce à C et quelques définitions.\nPour résumer, nous devons écrire un simple header en C contenant les définitions des méthodes que nous utiliserons ensuite. Puis nous chargeons ce header et la librairie associée, rédigeons une sorte de mapping entre les types C et nos types PHP (grâce à des méthodes spécifiques à FFI), puis une ou des classes qui vont intégrer les appels aux méthodes de la librairie.\nEn production Selon les retours de Pierre, nous pouvons utiliser FFI en production. C’est ce qu’ils font pour remplacer leur code Python et pouvoir directement communiquer sur les ports RS-232 en PHP. Toutefois FFI ajoute une couche supplémentaire qui, selon les cas, peut poser des soucis de performance. L’usage doit donc être réfléchi et le gain notable pour basculer dessus. De même que quelques notions en C sont nécessaires (pour l’écriture des headers et le typage), même si ce sont des notions assez basiques (pointeurs, etc.).\nFFI est une solution intéressante qui peut mériter que l’on s’y penche dans certains cas (souvent des environnements multi-langages ou ayant des besoins très spécifiques). Il ouvre le champ des possibles à PHP en plus de rattraper, une fois de plus, son retard sur d’autres langages de programmation qui intègrent FFI depuis de nombreuses versions.\nDu TensorFlow depuis PHP devient alors possible… sans extension 🙂\nReplay # Anne-Laure de Boissieu (Bedrock) — Revue de code : on n’est pas venu pour souffrir ! # Code review Conventional Comments Ayant intégré Bedrock il y a de cela quelques mois à peine, Anne-Laure de Boissieu était quelque peu anxieuse quant aux retours qu’elle pourrait avoir lors de ses merge requests. En effet, un malentendu à l’écrit peut arriver (et nous est tous déjà arrivé au moins une fois). Un commentaire anodin peut alors avoir un impact bien plus important que ce que l’on imaginait auprès de son interlocuteur, selon la tournure de phrase choisie, les mots employés, etc.\nMais Anne-Laure a découvert un cadre rassurant qui permet d’éviter ce genre de déboires. L’équipe se base sur les Conventional Comments afin de normaliser les réponses (dans la même idée que les Conventional Commits pour nos commits), expliciter l’intention et éviter au maximum toute forme de malentendu sur les reviews.\nLe résultat final permet une prise de confiance et un onboarding facilité selon elle. Tout en améliorant la qualité globale du projet grâce à une communication saine et sans ambiguïté (ou tout du moins réduite au minimum). Ce à moindres frais puisque l’adoption de cette règle est facilitée par l’existence d’extensions de navigateur (sous Chrome et Firefox).\nUn pas de plus vers une communication bienveillante au sein des équipes.\nReplay # Andreas Heigl (stella-maris.solutions) — Watch the clock # Tests PSR-20 Clock Dans sa conférence, Andreas Heigl nous parle de temps et de comment le maîtriser, notamment lors de tests. En effet, la fonction time() en PHP est une fonction impure et donc elle ne renvoie pas toujours la même valeur. Un code qui utilise cette fonction est difficilement testable, car son résultat peut varier.\nPour pallier ces soucis, Andreas nous propose d’utiliser une interface pour récupérer le temps dans nos applications.\nPsr/Clock/ClockInterface.php\u0026lt;?php namespace Psr\\Clock; interface ClockInterface { /** * Returns the current time as a DateTimeImmutable Object */ public function now(): \\DateTimeImmutable; } Comme l’espace de noms l’indique, cette interface est une PSR (la PSR-20), celle-ci est actuellement en brouillon.\nL’interface peut ensuite être implémentée pour renvoyer le “vrai” temps ou alors pour renvoyer un résultat déterministe pour nos tests.\nÀ retenir Cette solution permet d’isoler les appels aux fonctions impures. Finis les tests flaky !\nReplay # Sebastian Bergmann (thePHP.cc) \u0026amp; Roman Pronskiy (JetBrains) — The PHP Foundation: The past, the present, and the future # PHP Foundation Communauté PHP, malgré son long historique, n’avait pas de fondation officielle avant 2021. Le besoin est apparu rapidement en raison du bus factor, mais s’est amplifié, notamment à cause du départ de Nikita Popov. Il arrête d’investir du temps dans PHP pour se consacrer à LLVM au 1er décembre 2021. De nombreuses organisations se sont jointes afin de lancer officiellement la PHP Foundation dans le but de maintenir la pérennité du langage.\nL’usage des fonds est public et sert à missionner des développeurs, à temps plein ou occasionnellement. Elle ne vise pas à prendre un monopole décisionnel, ne souhaite pas s’impliquer dans les RFC et laisse à la communauté PHP Internals les décisions d’évolution du langage.\nÀ retenir On retiendra de la conférence qu’il est important que les entreprises qui utilisent tous les jours ce langage contribuent à sa pérennité.\nReplay # Forum PHP 2022 — Le mot de la fin # Un grand merci à l’AFUP d’avoir organisé ce forum exceptionnel.\nRetrouvez l’ensemble des conférences ici.\nDes règles métier complexes à modéliser ? Rule Engine, design patterns, tests déterministes : nos experts Symfony conçoivent des applications métier robustes et maintenables. Découvrir notre expertise Symfony ","date":"28 janvier 2022","externalUrl":null,"permalink":"/le-forum-php-2022-a-disneyland/","section":"Actualités","summary":"","title":"Le Forum PHP 2022 à Disneyland","type":"posts"}]