L’article de Nicolas Jourdan critique la pratique courante de lier directement les formulaires Symfony aux entités Doctrine, soulignant les problèmes d’architecture qui en découlent. L’auteur explique que cette approche crée un couplage implicite entre la couche de présentation (formulaire) et le modèle métier (entité), transformant cette dernière en simple transporteur de données HTTP. Bien que pratique à court terme, cette méthode introduit des tensions lorsque l’application évolue, notamment en mélangeant les responsabilités (validation, normalisation) et en rendant le code difficile à maintenir.
L’exemple concret d’un formulaire d’inscription à une conférence illustre ces limites. Les règles métier (comme la vérification de la capacité des sessions ou l’expiration des codes promo) finissent par être dispersées entre les contraintes du formulaire et celles de l’entité, complexifiant la logique et réduisant la clarté du code. L’auteur met en garde contre cette approche, qui semble initialement simple mais devient problématique sous la pression des évolutions produit.
Pour remédier à ces problèmes, Jourdan propose une séparation plus nette entre les formulaires et les entités, en utilisant des objets dédiés (DTO) pour capturer les données brutes de l’utilisateur avant de les transformer en entités métier. Cette méthode permet de préserver l’intégrité du domaine tout en gérant plus efficacement les interactions utilisateur, évitant ainsi les compromis architecturaux coûteux à long terme.
Le composant Form de Symfony est jugé efficace pour les cas simples mais rapidement complexe dès qu’on s’en écarte, notamment à cause du couplage entre logique métier, contrôleurs et interface, ce qui motive une approche alternative visant à mieux séparer les responsabilités. L’article propose de s’appuyer sur les nouveaux mécanismes comme MapQueryString et MapRequestPayload pour introduire un attribut personnalisé MapFormState qui hydrate un DTO, gère la validation et transmet au contrôleur à la fois les données et les erreurs, laissant ce dernier se concentrer uniquement sur le traitement métier tandis que les templates Twig gèrent entièrement l’affichage. Cette approche rapproche le fonctionnement d’une architecture découplée type Symfony + front moderne, en simplifiant la gestion des formulaires et en évitant la lourdeur des FormType traditionnels.
Cet article de Smashing Magazine compare les composants d'interface utilisateur Combobox, Multiselect, Listbox et Dual Listbox, expliquant leurs différences et leurs usages. Il détaille que le choix dépend du nombre d'options et de leur visibilité, avec des recommandations pour éviter de cacher les options fréquemment utilisées. Un guide pratique pour choisir le bon composant en fonction des besoins des utilisateurs.
Cet article de Matt Mochalkin sur Medium explore l'utilisation des Property Hooks et de l'Asymmetric Visibility introduits avec PHP 8.4 et Symfony 7.4 pour moderniser les applications Symfony. Il montre comment ces nouvelles fonctionnalités permettent de supprimer les getters et setters boilerplate, tout en maintenant une bonne encapsulation et une intégration transparente avec Doctrine ORM, le Serializer, le Validator et les Forms de Symfony. L'auteur illustre ces concepts avec des exemples concrets de refactorisation d'entités Doctrine en entités modernes et concises.
L'auteur explique dans cet article comment utiliser la validation des entrées HTML côté client comme une amélioration progressive pour l'expérience utilisateur, en complément de la validation côté serveur. Il montre comment utiliser les attributs natifs HTML comme pattern, minlength, maxlength, et title pour valider et styliser les entrées, tout en soulignant les limites d'accessibilité de ces méthodes. L'article propose ensuite d'améliorer l'accessibilité en utilisant l'API de validation des contraintes JavaScript pour personnaliser l'affichage des erreurs. Un exemple interactif est disponible sur CodePen.
L'article explique comment associer explicitement des éléments HTML, comme les labels et les champs de formulaire, en utilisant des IDREFs. Il souligne l'importance de cette pratique pour améliorer l'accessibilité, notamment pour les technologies d'assistance. L'auteur détaille les bonnes pratiques, telles que l'unicité et l'existence des IDs, et propose des outils pour détecter les références brisées. Un exemple concret illustre l'utilisation de l'attribut for dans une balise <label> pour référencer l'ID d'un champ <input>.
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.
Vous créez une application Symfony, et vous avez un petit formulaire. Vous souhaitez ne pas construire un formulaire Symfony (trop lourd). L'auteur montre une fonctionnalité très sympathique des Symfony Live Components : le "ValidatableComponentTrait"
Tout est dans le titre
Si vous avez un formulaire dont le bouton "submit" n'est pas placé entre les balises
Tout est dans le titre
Une liste des attributs bien pratiques de l'élément input
Tout est dans le titre
Quelques bizarreries des formulaires HTML selon qu'il y ait un ou plusieurs champs input
Tout est dans le titre
Tout est dans le titre
Tout est dans le titre
Tout est dans le titre
Tout est dans le titre