Quotidien Shaarli
October 19, 2025
Le Forum PHP 2025 a célébré les 30 ans de PHP, les 25 ans de l’AFUP, les 20 ans de Symfony et les 15 ans d’API Platform, avec des annonces et retours d’expérience marquants. Symfony 8 a été présenté avec ses évolutions (PHP 8.4 minimum, typage renforcé, suppression de code obsolète) et ses outils phares comme Flex, Autowiring ou Symfony AI. PHP 8.5 introduit notamment le pipe operator pour le chaînage de fonctions et des améliorations sur les URL et les emojis. L’IA était au cœur des discussions, avec des démonstrations du protocole MCP pour rendre les LLM capables d’agir via des outils serveurs, ainsi que des réflexions sur l’impact des IA génératives sur le métier de développeur. Des talks ont aussi mis en lumière des alternatives comme HTMX pour des applications dynamiques sans SPA, l’optimisation SQL face aux ORM, et des solutions pour la résilience des applications. Enfin, des retours sur la sécurité (WannaCry), l’accessibilité (RGAA) et l’embarquement de PHP dans des binaires autonomes ont complété ce panorama technique et inspirant. Une édition riche en innovations et en partage d’expertise pour la communauté PHP.
L’article de Bohdan Pastukh critique l’approche souvent enseignée par la documentation Symfony, qui pousse vers un Anemic Domain Model : les entités (comme User) se réduisent à des conteneurs de données avec des getters/setters, tandis que la logique métier est déplacée vers des services externes (ex : ContactDataService). L’auteur souligne que cette pratique, bien que courante dans les tutoriels, conduit à un code moins cohésif et moins orienté objet. Il encourage à privilégier les Rich Models, où la logique métier est encapsulée directement dans les entités, pour un design plus robuste et maintenable.
Exemple critiqué :
class User {
private string $contactType;
private string $contact;
public function setContactType(string $contactType): void { ... }
public function setContact(string $contact): void { ... }
}
class ContactDataService {
public function changeContactData(string $contactType, string $contact): void { ... }
}
Alternative suggérée : Intégrer la validation et la logique dans l’entité User elle-même.
L’article explique comment automatiser la découverte et l’enregistrement des commandes console dans une application PHP utilisant le framework Power Modules et Symfony Console. L’auteur part du constat que la registration manuelle des commandes (via une boucle sur les modules et leurs composants exportés) est répétitive et peu élégante. Il propose une solution basée sur un PowerModuleSetup dédié, qui s’intègre au cycle de vie des modules pour collecter et enregistrer automatiquement les commandes, en s’appuyant sur le conteneur de dépendances de Symfony. La solution évolue vers une approche optimisée avec un ContainerCommandLoader, permettant un chargement paresseux des commandes. Le résultat est un code plus modulaire, réutilisable et sans duplication, idéal pour les architectures basées sur Power Modules. Le package est disponible via Composer : power-modules/console.
Ce billet explique comment tirer pleinement parti du composant symfony/object-mapper, bien au-delà d'une simple hydratation d'objets à partir de tableaux. L'auteur montre que cet outil, basé sur le puissant Serializer de Symfony, permet de gérer des cas avancés comme la création de DTO immutables (avec promotion de propriétés dans le constructeur), la gestion de structures imbriquées et de collections, l'application de logiques personnalisées (ex : conversion de chaînes en DateTimeImmutable), et l'adaptation entre différentes conventions de nommage (snake_case ↔ camelCase). Grâce à des exemples concrets en Symfony 7.3, il démontre comment configurer et utiliser l'ObjectMapper pour des transformations de données élégantes et maintenables, tout en intégrant la validation et la gestion des erreurs. Un guide pratique pour optimiser la manipulation de données dans des applications PHP modernes.