Symfony2 • Rappel un peu moins rapide de ce que c'est que le DDD • Symfony2 et Doctrine2 sont-ils orientés DDD ? • Retours d'expériences de deux projets DDD avec Symfony2
reflet du besoin fonctionnel • Le code source adopte le vocabulaire fonctionnel • Le code source facilite : – Le changement – La gestion des règles métiers – La maintenabilité
Est un service purement fonctionnel (pas de classe outils) Spécification • Représente une règle métier $dog=new Dog; $rule=new CanBeSoldSpecification; if($rule>isSatisfedBy($dog)) { // ... }
sont des Objets Valeur • En pratique, les Objets Valeurs sont des entités spécifiques • Doctrine 2 gère difficilement les Types complexes (ex : une adresse, elle même composée de rue, ville, etc.) • Doctrine 2 permet difficilement de serializer des DbalTypes autrement qu'en String
de déterminer comment une Collection sera persistée • En théorie, il est possible d'utiliser des Collections personnalisées à la place des Collection Doctrine • En pratique, pour être viable, il faut un peu d'investissement
à l'utilisation de vrais identifiants : • La systématisation de l'utilisation de vrais Identifiants ne fait pas partie de Doctrine2 class UserRepository { public function getById(UserId $id) { } }
possible d'écrire du code totalement indépendant du framework • En réalité, le code est écrit dans un cadre (framework) • En réalité, ce n'est pas grave pour les couches Application et Infrastructure
JSR 303 (Bean Validation) 1. Les objets contiennent des règles de validation 2. Les objets sont remplis avec les données à valider (potentiellement invalides) 3. Les objets sont validés • Une entité doit toujours être dans un état valide • Le processus classique de validation de données dans Symfony2 introduit une complexité forte dans la logique DDD
• Où placer mes entités ? • Comment séparer mes couches ? Dans un seul bundle ? Dans plusieurs bundles ? • Mon domain est-il un Bundle comme un autre ?
la notion d' « Acteur » (ou Agent) • Renforcement de l'utilisation d'Evénements public function activateProjectAction(Project $project, Context $context) { } public function editAction(Project $project, EditableContext $context) { }
: • Il faut parfois se battre avec la logique Symfony2 / Doctrine • Ex : ACL peu évolutifs doctrine_mongodb: connections: mappings: model: type: yml dir: %kernel.root_dir%/../../src/Acme/Application/Mapping prefix: Hal\Manage\Crm\Domain alias: Acme\Domain is_bundle: false
• Symfony2 + Doctrine2 se prête assez bien au DDD • Mais ce ne sont PAS des recettes miracle • Peuvent être des freins • Doivent être détournés • Nécessitent un bon niveau technique