Hexagonal Maker Bundle

Architecture Hexagonale

Bundle Symfony Maker pour l'Architecture Hexagonale (Ports & Adapters)

Dernière Version Statut CI Licence Version PHP Symfony

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

Lire le guide complet →


⚡ 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)

Voir les 19 commandes →


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.php
  • Domain/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.php
  • Application/Register/RegisterCommand.php
  • Application/Register/RegisterCommandHandler.php
  • Application/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.php
  • Infrastructure/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.php
  • UI/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.

Guide d’architecture →


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

Exemples CRUD →


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

Sponsor sur GitHub M'offrir un café