ahmed-bhs/hexagonal-maker-bundle
L'architecture hexagonale (alias Ports & Adapters) vous aide à construire des applications maintenables et testables en :
É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 →
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) |
| 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 |
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 |
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.phpGé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.phpAdaptateurs 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.ymlGé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%%{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.
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) :
%%{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.
Nous accueillons les contributions ! Voir notre Guide de Contribution.
Licence MIT - voir LICENSE pour les détails.
Créé par Ahmed EBEN HASSINE
How can I help you explore Laravel packages today?