Cet article aborde la cartographie des Value Objects avec Doctrine ORM, en utilisant les attributs PHP, les embeddables et les drivers PHP pour améliorer la conception des entités.
L’article souligne que la documentation officielle de Doctrine montre souvent des exemples d’entités anémiques (avec des getters/setters simples), mais propose une approche plus robuste en utilisant des Value Objects pour encapsuler la logique métier et garantir la cohérence des données. Il explique comment mapper ces objets en base de données avec Doctrine, notamment via :
- Les attributs PHP pour définir les métadonnées de mapping.
- Les embeddables pour intégrer des Value Objects directement dans les entités.
- Les drivers PHP pour une configuration plus propre et moderne.
L’objectif est de passer d’un modèle anémique à un modèle riche, où la validation et la logique métier sont encapsulées dans les Value Objects, plutôt que dispersées dans les services ou les setters. Une lecture utile pour ceux qui veulent optimiser leur architecture avec Doctrine et PHP 8+.
⚠️ Accès réservé aux membres Medium : Lien vers l’article (nécessite un abonnement ou un accès via le lien partagé).
Un bundle Symfony pour utiliser les Google Fonts sans enfreindre le RGPD
Cet article explique comment Symfony utilise la classe ReflectionClass de PHP pour offrir sa flexibilité et son automatisation. Voici les points clés :
- Injection de dépendances : Symfony inspecte les constructeurs des classes via
ReflectionClasspour identifier et injecter automatiquement les dépendances typées, sans configuration manuelle. - Routing et contrôleurs : Grâce à la réflexion, Symfony lit les attributs de route (comme
#[Route]) et injecte dynamiquement les arguments des méthodes de contrôleur (ex. : récupération d’une entité depuis la base via leParamConverter). - Sérialisation : Le composant Serializer utilise la réflexion pour découvrir les propriétés et leurs types, permettant une conversion automatique entre objets et formats comme JSON/XML.
En résumé, la Reflection API est au cœur de la magie de Symfony, rendant possible l’injection de dépendances, le routage intelligent et la manipulation des données sans configuration statique.
Cet article présente une approche pragmatique pour construire une application SaaS multi-tenant avec Symfony, en utilisant une base de données partagée et une seule codebase pour plusieurs clients (tenants). L’article s’appuie sur l’expérience de l’auteur, qui a développé une plateforme pour des marques de retail, chacune ayant ses propres magasins, utilisateurs et règles d’accès.
Points clés :
- Résolution du tenant : Identification du client actif via la session (back-office) ou le sous-domaine (front-office), stockée dans un service
TenantContextaccessible partout dans l’application. - Isolation des données : Toutes les entités liées à un client incluent un
brand_id, et les requêtes sont automatiquement filtrées par ce contexte. - Contrôle d’accès (ACL) : Gestion des fonctionnalités et permissions par client via des listes de contrôle d’accès (ACL) et des voters Symfony, permettant d’activer/désactiver des fonctionnalités par marque.
- Architecture unifiée : Le même
TenantContextest utilisé pour le back-office (session) et le front-office (domaine), garantissant une cohérence et une sécurité optimale.
L’article insiste sur la simplicité, la maintenabilité et l’évolutivité de cette solution, idéale pour les SaaS nécessitant une isolation des données sans complexité infrastructurelle.
Cet article explique comment construire un serveur Model Context Protocol (MCP) pour une application Symfony, permettant à des assistants IA comme Claude d’interagir directement avec vos données et fonctionnalités via des requêtes en langage naturel.
Le tutoriel propose un exemple concret : une application de gestion de clients avec Symfony, où l’on ajoute un serveur MCP pour permettre à l’IA de rechercher des clients, consulter leurs commandes, analyser des statistiques, etc. Il détaille les étapes clés : installation du SDK MCP, création de "tools" (outils) en PHP avec des attributs, configuration d’un serveur MCP, et intégration avec Claude Desktop. Le projet utilise une base SQLite avec des entités Customer, Order, OrderItem et Product, et fournit des exemples de requêtes possibles (recherche par nom, ville, top dépensiers, etc.).
Le code source est disponible sur GitHub, et le tutoriel inclut des captures d’écran de l’interface. Une bonne ressource pour les développeurs PHP/Symfony souhaitant connecter leurs applications à des assistants IA via MCP.
L’article passe en revue les principaux formats audio (sans compression comme WAV/AIFF, sans perte comme FLAC/ALAC, et avec perte comme MP3, Vorbis, Opus, AAC) et leurs usages : archivage, stockage quotidien ou streaming. Il explique l’importance du débit binaire (CBR/VBR) et de la compatibilité des formats avec les appareils. Pour l’archivage, le FLAC est recommandé pour sa qualité et son ouverture, tandis que pour un cloud musical, l’Opus (128 kbps VBR) est privilégié pour son équilibre qualité/taille et sa rapidité d’encodage. Un benchmark illustre les différences de taille entre formats, et un glossaire clarifie les termes techniques. L’auteur partage son choix : FLAC pour l’archivage, Opus pour le cloud.
L’article explique comment concevoir des tableaux clairs et efficaces, en s’appuyant sur les travaux d’Edward Tufte et de Charlie Munger. Il souligne que le choix entre tableau et graphique dépend de l’usage : les tableaux conviennent mieux aux petits jeux de données et aux comparaisons précises, tandis que les graphiques mettent en valeur les tendances et le mouvement des données. Pour rendre un tableau lisible, il recommande de limiter les bordures et les couleurs, d’aligner correctement le texte et les nombres (à droite pour ces derniers), et d’éviter les répétitions inutiles. L’article propose aussi des bonnes pratiques en HTML/CSS pour structurer et styliser les tableaux, comme l’utilisation de <thead>, <tbody>, et <tfoot>, l’alignement vertical sur la baseline, et l’adaptation responsive pour mobile. Enfin, il insiste sur l’importance de maximiser le ratio "data-ink" (encre utile) et de supprimer tout élément redondant ou superflu pour faciliter la compréhension. Une référence utile pour quiconque souhaite améliorer la présentation de données.
Ploum analyse l’éclatement imminent de la "bulle IA", soulignant que l’industrie repose sur des promesses irréalistes (comme un abonnement mensuel de 100€ par habitant pour ChatGPT) et un marketing agressif, alors que l’adoption réelle par le grand public reste faible. Il compare cette situation à celle des smartphones, dont le marché est désormais saturé et en déclin, malgré des années de croissance forcée. Selon lui, l’IA, contrairement aux smartphones, ne séduit pas les utilisateurs lambda, qui la perçoivent comme une complication plutôt qu’une simplification. L’auteur espère que l’éclatement de cette bulle pourrait libérer une offre d’électricité abondante et bon marché (notamment renouvelable), accélérant ainsi la fin de la dépendance au pétrole. Il conclut en évoquant les risques politiques et économiques de cette transition, tout en imaginant un futur plus sobre et low-tech, inspiré par des utopies comme "Vélorutopia".
L’article présente la propriété CSS field-sizing: content, qui permet de dimensionner dynamiquement les champs de formulaire (comme les <select> ou <input>) en fonction de leur contenu, sans recourir à JavaScript. Actuellement supportée uniquement par Chrome, cette propriété offre une solution élégante pour adapter la largeur des champs à leur contenu, tout en respectant les placeholders comme largeur minimale. L’auteur illustre son utilité à travers plusieurs cas d’usage : interfaces conversationnelles (formulaires plus naturels), pagination (menus déroulants adaptés), saisie d’URL (champs de sous-domaines ou identifiants), ou encore sections héroïques avec filtres dynamiques. L’article souligne aussi l’importance de définir des largeurs minimales et maximales pour éviter les problèmes d’affichage, et encourage son adoption comme amélioration progressive, compatible avec les navigateurs ne la supportant pas encore. Une propriété prometteuse pour des designs plus fluides et intuitifs.
Dans cette note intitulée "Humanité, IA et le règne animal", l’autrice·eur partage une réflexion personnelle sur l’individualisme croissant dans la société, déclenchée par une discussion et un podcast sur l’IA en tant que psychologue. Iel interroge la place de la gentillesse et de l’entraide, souvent perçues comme des faiblesses dans un monde où "le fort vit, le faible non". À travers des anecdotes (aider un·e inconnu·e, un malaise dans le métro parisien) et des exemples d’associations humanitaires, iel rappelle que l’humanité ne se réduit pas à la loi du plus fort, contrairement au règne animal.
L’autrice·eur établit un lien entre cette logique individualiste et l’attrait pour les IA génératives, qui offrent une écoute sans jugement dans un monde où les réseaux sociaux et les médias amplifient la solitude et le sentiment d’insuffisance. Iel met en garde contre l’illusion d’une IA "humaine" et souligne l’importance de reconnaître et de traiter les problèmes de santé mentale, tout en valorisant la dissidence et la diversité comme moteurs d’évolution sociale. Enfin, iel encourage à consulter des psychologues plutôt que de se tourner vers des solutions technologiques, et rend hommage au travail des associations qui agissent dans l’ombre pour aider les autres.
Merci pour cet article qui a mis des mots sur mon ressenti - visiblement je ne suis pas le seul
Cet article remet les pendules à l'heure : Postman et consorts ne servent à rien... puisque cURL fait tout ce qu'ils font en plus rapide et léger. L'article rappelle les options à passer pour les principaux cas d'usage : requêtes POST, ajout d'entêtes, upload de fichiers, cookies, authentification basique / OAuth / etc.
Pour le partage, tout peut s'écrire dans des scripts versionnables.
L’article raconte une expérience douloureuse : l’utilisation du tag latest pour une image Docker a causé une panne en production après qu’une mise à jour silencieuse de l’image de base (PostgreSQL) ait changé la version de collation du système d’exploitation, rendant la base de données incompatible. L’auteur explique que latest n’est pas synonyme de « stable » ou « sûr », mais simplement de « dernière version disponible », ce qui peut varier à tout moment. Il détaille trois raisons d’éviter latest : stabilité (comportement cohérent), reproductibilité (diagnostic et audit facilités), et contrôle des mises à jour (éviter les surprises). La solution ? Toujours spécifier un tag explicite (ex: postgres:15.3-alpine) dans Docker, Docker Compose ou Kubernetes. Un rappel utile : ne jamais laisser le choix de la version à quelqu’un d’autre, surtout en production.
Les fichiers .http offrent une alternative légère et efficace aux outils comme Postman pour tester et documenter des APIs directement depuis un éditeur de code. Ces fichiers texte, basés sur la syntaxe HTTP standard, permettent de décrire, versionner et exécuter des requêtes HTTP sans dépendre d’un outil externe ou d’un compte cloud. Intégrés nativement dans des IDE comme VS Code (via l’extension REST Client) ou JetBrains, ils facilitent le versionnement avec Git, la collaboration via des pull requests, et servent de documentation vivante pour les APIs. Leur simplicité et leur indépendance technologique en font un choix idéal pour les équipes souhaitant éviter les outils lourds et centraliser leurs tests d’API dans leur repository. L’article propose des exemples concrets avec les APIs publiques françaises (comme l’API Geo et Adresse), montre comment gérer les variables et environnements, et explique comment automatiser ces tests dans des pipelines CI/CD avec des outils comme httpyac. Une solution pragmatique pour les développeurs cherchant à simplifier leur workflow tout en gardant une documentation et des tests à jour.
Symfony propose AssetMapper, une solution radicalement simple pour gérer les assets (JS, CSS, images) sans recourir à Node.js ou à des outils de build complexes comme Webpack. Basé sur la technologie native des navigateurs importmap, AssetMapper permet d’utiliser directement les imports ES6 dans le navigateur, sans étape de compilation. Il génère automatiquement une balise <script type="importmap"> qui mappe vos dépendances et vos fichiers locaux, et gère le versionnage des assets pour un cache busting efficace. L’installation se fait via Composer, et une simple commande (bin/console importmap:require) suffit pour ajouter une bibliothèque JS, qui est ensuite téléchargée depuis un CDN et stockée localement. En production, une commande (asset-map:compile) copie et versionne les fichiers dans public/assets/, avec option de pré-compression Gzip. Pour la minification, le bundle sensiolabs/minify-bundle s’intègre parfaitement. Résultat : zéro build, zéro npm, et une gestion des assets simplifiée et performante, idéale pour les applications Symfony classiques ou utilisant Hotwire/Stimulus. Une approche minimaliste et efficace pour ceux qui veulent éviter la complexité du frontend moderne.
Cet article explore le concept des expressions en JavaScript, extrait du cours JavaScript for Everyone. Une expression est un bout de code qui, une fois évalué, produit une valeur (exemple : 2 + 2 donne 4). L’article détaille plusieurs types d’expressions : les expressions primaires (comme les littéraux numériques ou les variables), les opérateurs de regroupement (parenthèses pour contrôler l’ordre d’évaluation), et les expressions avec effets de bord (comme l’assignation ou l’appel de fonction, qui produisent une valeur tout en effectuant une action). Il aborde aussi des cas particuliers comme l’opérateur virgule, qui évalue plusieurs expressions mais ne retourne que la dernière, et souligne que la plupart des déclarations (sauf var) ne sont ni des expressions ni des instructions. L’objectif est de clarifier comment JavaScript interprète et manipule les valeurs, offrant une base solide pour comprendre la logique interne du langage.
L’article présente deux outils de reconnaissance vocale libres, gratuits et respectueux de la vie privée : Murmure (Windows/Linux) et Handy (Windows/Linux/macOS). Fonctionnant entièrement hors ligne, ils évitent toute télémétrie ou connexion Internet, garantissant que les données vocales restent locales. Murmure utilise le modèle NVIDIA Parakeet, supportant 25 langues européennes, et est optimisé pour fonctionner sur des configurations modestes (2 Go de RAM, 1 Go d’espace disque). Handy, quant à lui, propose plusieurs modèles d’IA (Whisper et Parakeet) et s’avère très réactif, même sur du matériel ancien. Les deux logiciels sont faciles à configurer, permettent de dicter du texte dans n’importe quel champ (traitement de texte, navigateur, etc.) et offrent la possibilité d’enrichir leur dictionnaire avec du vocabulaire spécialisé. L’auteur souligne leur simplicité d’utilisation et la qualité des transcriptions, malgré quelques corrections mineures nécessaires. Une solution idéale pour ceux qui cherchent une alternative privée aux outils en ligne.
Ce comic explique de façon simple et visuelle le fonctionnement des appels système (system calls) sous Linux : les programmes (en Python, Java, C, etc.) ne savent pas directement interagir avec le matériel (comme lire un fichier, créer un processus ou modifier des permissions). Ils demandent au noyau Linux de le faire pour eux via des appels système, chacun identifié par un numéro. L’outil strace permet d’observer ces appels en temps réel, par exemple avec la commande strace ls /tmp. Une ressource ludique et accessible pour comprendre un concept technique fondamental ! 🖥️✨
Ploum partage une réflexion inspirée par L’odyssée du pingouin cannibale de Yann Kerninon et Éloge du bug de Marcello Vitali-Rosati : nos outils nous transforment. En citant la phrase "Ce n’est pas le penseur qui fait la pensée, mais la pensée qui fait le penseur", il souligne comment les plateformes façonnent nos comportements et nos idées, souvent en masquant leur matérialité et en nous rendant dépendants. À travers son expérience personnelle (passage de WordPress à un blog statique, découverte de Gemini et du minimalisme numérique), il illustre comment l’adoption d’un outil influence notre manière de penser, d’écrire et même notre idéologie. Il invite à se demander non pas "Qu’est-ce que cet outil peut faire pour moi ?", mais "Qu’est-ce que cet outil va faire de moi ?" — une question cruciale face aux outils "faciles" ou dominants, dont les effets peuvent être insidieux (ex. : réseaux sociaux, PowerPoint, IA). Une invitation à choisir consciemment nos outils pour préserver notre autonomie et notre créativité.
L’article met en lumière l’impact des attributs PHP 8 sur l’écosystème Symfony, remplaçant progressivement les annotations et le YAML pour une configuration plus moderne et unifiée (routes, sécurité, Doctrine, DTOs). Il souligne aussi des innovations comme les Property Hooks de PHP 8.4 avec Doctrine 3.4, qui simplifient la gestion des getters/setters, ainsi que l’introduction des Live Components et Twig Components, permettant une approche plus réactive et typée du front-end, sans JavaScript. Une évolution majeure pour les développeurs Symfony, vers plus de simplicité et de puissance.
L’article explore comment adapter des designs éditoriaux et distinctifs aux petits écrans, en évitant la monotonie des colonnes infinies. L’auteur, Andy Clarke, démontre que le design pour mobile ne doit pas se limiter à empiler du contenu verticalement, mais peut s’inspirer des magazines en créant des « moments » visuels uniques : utilisation du défilement horizontal pour regrouper des éléments (comme des pochettes d’albums), placement d’éléments hors-cadre pour conserver la personnalité du design, ou encore création de mini-maquettes défilables qui rappellent les doubles pages imprimées. Il propose des techniques CSS modernes comme les container queries, le shape-outside, et les media queries d’orientation pour recomposer dynamiquement les layouts selon l’espace disponible et l’orientation de l’écran. L’objectif est de préserver l’impact visuel et la narration, même sur mobile, en jouant sur la variété, le rythme et l’interaction.