Hexagonal Maker Bundle
Bundle Symfony Maker pour l'Architecture Hexagonale (Ports & Adapters)
✨ 19 commandes maker | 💎 Domaine Pur | 🎯 Pattern CQRS | 🏗️ Couverture Complète
Pourquoi l’Architecture Hexagonale ?
L’architecture hexagonale (alias Ports & Adapters) vous aide à construire des applications maintenables et testables en :
- 💎 Isolation du Domaine - Logique métier indépendante des frameworks
- 🎯 Contrôle des Dépendances - L’infrastructure dépend du domaine, pas l’inverse
- ⚡ Vitesse de Test - Tests unitaires 1000x plus rapides (pas de base de données)
- 🔄 Liberté Technologique - Changez de base de données, de framework sans toucher la logique métier
- 💰 Coût Prévisible - Les fonctionnalités coûtent un temps constant, pas de taxe de dette technique
⚡ Démarrage Rapide (2 minutes)
Étape 1 : Installation
composer require ahmed-bhs/hexagonal-maker-bundle --dev
Étape 2 : Générez votre premier module
# Créer un module d'enregistrement utilisateur
bin/console make:hexagonal:entity user/account User
bin/console make:hexagonal:repository user/account User
bin/console make:hexagonal:command user/account register --factory
bin/console make:hexagonal:controller user/account RegisterUser /users/register
Étape 3 : Configurez le mapping Doctrine
# config/packages/doctrine.yaml
doctrine:
orm:
mappings:
UserAccount:
type: yml
dir: '%kernel.project_dir%/src/User/Account/Infrastructure/Persistence/Doctrine/Orm/Mapping'
prefix: 'App\User\Account\Domain\Model'
Résultat : Module hexagonal complet avec domaine pur, commandes CQRS et contrôleurs web ! 🚀
Guide d’installation complet →
Fonctionnalités
19 Commandes Maker
Générez une architecture hexagonale complète avec une seule commande :
| Couche | Maker | Ce qu’il génère |
|---|---|---|
| Domaine | make:hexagonal:entity |
Entités PHP pures + mapping YAML |
| Domaine | make:hexagonal:value-object |
Value objects immuables |
| Domaine | make:hexagonal:exception |
Exceptions métier |
| Application | make:hexagonal:command |
Commandes CQRS + handlers |
| Application | make:hexagonal:query |
Queries CQRS + handlers + réponses |
| Application | make:hexagonal:repository |
Port repository + adaptateur Doctrine |
| UI | make:hexagonal:controller |
Contrôleurs web |
| UI | make:hexagonal:form |
Formulaires Symfony |
| UI | make:hexagonal:cli-command |
Commandes console |
| Tests | make:hexagonal:use-case-test |
Tests de cas d’usage |
| Rapide | make:hexagonal:crud |
Module CRUD complet (20+ fichiers) |
Documentation
| Guide | Description |
|---|---|
| Démarrage Rapide | Installez et générez votre premier module en 2 minutes |
| Commandes Maker | Référence complète des 19 commandes maker |
| Guide Architecture | Plongée profonde dans les patterns d’architecture hexagonale |
| Pourquoi Hexagonal | Business case et bénéfices techniques |
| Principes SOLID | Comment l’architecture hexagonale applique SOLID |
| Exemples | Exemples réels et cas d’usage |
Documentation Avancée (Nouveaux Guides) 🆕
Ces guides approfondis couvrent les aspects critiques de l’architecture hexagonale :
| Guide | Description |
|---|---|
| Domain vs Application Logic | Guide de décision : où placer votre logique métier |
| Request-Response Flow | Flux complet end-to-end avec diagrammes |
| Port Design Principles | Comment concevoir des interfaces de ports efficaces |
| Primary vs Secondary Adapters | Comprendre les deux côtés de l’hexagone |
| CQRS: Cost-Benefit Analysis | Quand utiliser CQRS (et quand l’éviter) |
| Dependency Injection Guide | Configuration Symfony complète |
| Factory Pattern Guide | Implémentation complète des factories |
| Error Handling Strategy | Gestion des exceptions et des erreurs |
| Anti-Patterns & Pitfalls | Éviter les erreurs courantes |
Exemple : Module Utilisateur Complet
Étape 1 : Domaine
Générer les entités de domaine pures
bin/console make:hexagonal:entity user/account User
bin/console make:hexagonal:value-object user/account Email
bin/console make:hexagonal:exception user/account InvalidEmailException
Généré :
Domain/Model/User.php(PHP pur)Domain/ValueObject/Email.phpDomain/Exception/InvalidEmailException.php
Étape 2 : Application
Générer les cas d’usage et commandes
bin/console make:hexagonal:repository user/account User
bin/console make:hexagonal:command user/account register --factory
bin/console make:hexagonal:query user/account find-by-id
Généré :
Domain/Port/UserRepositoryInterface.phpApplication/Register/RegisterCommand.phpApplication/Register/RegisterCommandHandler.phpApplication/FindById/FindByIdQuery.php
Étape 3 : Infrastructure
Adaptateurs auto-générés
# Déjà générés avec la commande repository !
Généré :
Infrastructure/Persistence/Doctrine/DoctrineUserRepository.phpInfrastructure/Persistence/Doctrine/Orm/Mapping/User.orm.yml
Étape 4 : UI
Générer contrôleurs et formulaires
bin/console make:hexagonal:controller user/account RegisterUser /users/register
bin/console make:hexagonal:form user/account User
Généré :
UI/Http/Web/Controller/RegisterUserController.phpUI/Http/Web/Form/UserType.php
Couches d’Architecture
%%{init: {'theme':'base', 'themeVariables': { 'fontSize':'14px'}}}%%
graph TB
subgraph UI["🎮 COUCHE UI"]
HTTP["Contrôleurs HTTP"]
CLI["Commandes CLI"]
end
subgraph APP["⚙️ COUCHE APPLICATION"]
Commands["Commandes & Queries"]
end
subgraph DOMAIN["💎 COUCHE DOMAINE"]
Entities["Entités & Value Objects"]
Ports["Ports (Interfaces)"]
end
subgraph INFRA["🔌 COUCHE INFRASTRUCTURE"]
Adapters["Adaptateurs (Implémentations)"]
end
UI ==>|utilise| APP
APP ==>|dépend de| DOMAIN
INFRA -.->|implémente| Ports
style DOMAIN fill:#C8E6C9,stroke:#2E7D32,stroke-width:4px
style APP fill:#B3E5FC,stroke:#0277BD,stroke-width:3px
style INFRA fill:#F8BBD0,stroke:#C2185B,stroke-width:3px
style UI fill:#E1BEE7,stroke:#6A1B9A,stroke-width:3px
Règle de Dépendance : Toutes les dépendances pointent vers l’intérieur. Le domaine n’a aucune dépendance.
CRUD en 1 Commande ⚡
Générez un module CRUD complet avec toutes les couches :
bin/console make:hexagonal:crud blog/post Post --with-tests --with-id-vo
Généré (30+ fichiers) :
- Entité + ValueObjects + Repository
- 5 Cas d’Usage (Create, Update, Delete, Get, List)
- 5 Contrôleurs + Formulaire
- Tous les tests (Cas d’Usage + Contrôleur)
- Mapping YAML Doctrine
Architecture Layers
%%{init: {'theme':'base', 'themeVariables': { 'fontSize':'14px'}}}%%
graph TB
subgraph UI["🎮 COUCHE UI"]
HTTP["Contrôleurs HTTP"]
CLI["Commandes CLI"]
end
subgraph APP["⚙️ COUCHE APPLICATION"]
Commands["Commandes & Queries"]
end
subgraph DOMAIN["💎 COUCHE DOMAINE"]
Entities["Entités & Value Objects"]
Ports["Ports (Interfaces)"]
end
subgraph INFRA["🔌 COUCHE INFRASTRUCTURE"]
Adapters["Adaptateurs (Implémentations)"]
end
UI ==>|utilise| APP
APP ==>|dépend de| DOMAIN
INFRA -.->|implémente| Ports
style DOMAIN fill:#C8E6C9,stroke:#2E7D32,stroke-width:4px
style APP fill:#B3E5FC,stroke:#0277BD,stroke-width:3px
style INFRA fill:#F8BBD0,stroke:#C2185B,stroke-width:3px
style UI fill:#E1BEE7,stroke:#6A1B9A,stroke-width:3px
Règle de Dépendance : Toutes les dépendances pointent vers l’intérieur. Le domaine n’a aucune dépendance.
Prérequis
- PHP 8.1+
- Symfony 6.4+ ou 7.x
- Composer
Contribution
Nous accueillons les contributions ! Voir notre Guide de Contribution.
Licence
Licence MIT - voir LICENSE pour les détails.
Créé par Ahmed EBEN HASSINE
