Le problème que l'architecture hexagonale résout
- Le domaine métier, indépendant de tout framework
- Les ports, des interfaces qui définissent les besoins du domaine
- Les adapters, qui implémentent ces ports avec une technologie concrète (Doctrine, SOAP, REST, etc.)
Structure type
src/
├── Domain/
│ ├── Model/
│ └── Port/
├── Application/
│ └── UseCase/
└── Infrastructure/
├── Persistence/
└── Http/
Le domaine ne connaît jamais Symfony, Doctrine ou une librairie HTTP. Il définit uniquement des interfaces (ports). L'infrastructure implémente ces interfaces.
Exemple concret : un port de persistance
Php
// Domain/Port/BeneficiaireRepositoryInterface.php
interface BeneficiaireRepositoryInterface
{
public function findByNir(string $nir): ?Beneficiaire;
}
Php
// Infrastructure/Persistence/DoctrineBeneficiaireRepository.php
final class DoctrineBeneficiaireRepository implements BeneficiaireRepositoryInterface
{
public function findByNir(string $nir): ?Beneficiaire
{
// logique Doctrine ici, invisible du domaine
}
}
Bénéfices observés en pratique
- Tests unitaires rapides sur la logique métier, sans bootstrap Symfony complet
- Changement d'infrastructure facilité : remplacer un appel SOAP par une API REST devient un changement localisé à l'adapter, sans toucher au domaine
- Séparation des responsabilités plus lisible pour les revues de code