Aller au contenu

C3 · Composants Backend

Le diagramme de composants backend (niveau 3 C4) détaille l'organisation interne de l'API Laravel selon les principes DDD.


Diagramme

C4Component
    title Composants — API Laravel (DDD)

    Container_Boundary(api, "API Laravel") {
        Component(controllers, "Controllers API V1", "Laravel Http", "Point d'entrée HTTP\nValidation via FormRequests\nRéponse via Resources")

        Component_Boundary(domain, "Domain Layer") {
            Component(auth_domain, "Auth Domain", "PHP Service", "Inscription, login\nGestion tokens JWT")
            Component(game_domain, "Game Domain", "PHP Service", "Création parties\nValidation scores")
            Component(club_domain, "Club Domain", "PHP Service", "Gestion clubs\nTerrains, créneaux")
            Component(reservation_domain, "Reservation Domain", "PHP Service", "Réservation de terrains\nGestion créneaux")
        }

        Component(repo_interfaces, "Repository Interfaces", "PHP Interface", "Contrats d'accès données\nindépendants de l'ORM")

        Component_Boundary(infra, "Infrastructure Layer") {
            Component(eloquent_repos, "Eloquent Repositories", "Laravel Eloquent", "Implémentations concrètes\ndes repositories")
        }

        Component(events, "Domain Events", "Laravel Events", "Événements métier\n(ScoreValidated, GameCompleted)")
        Component(jobs, "Queue Jobs", "Laravel Queues", "Tâches asynchrones\n(Email, Notifs)")
    }

    Rel(controllers, auth_domain, "Appelle")
    Rel(controllers, game_domain, "Appelle")
    Rel(controllers, club_domain, "Appelle")
    Rel(controllers, reservation_domain, "Appelle")
    Rel(auth_domain, repo_interfaces, "Utilise")
    Rel(game_domain, repo_interfaces, "Utilise")
    Rel(club_domain, repo_interfaces, "Utilise")
    Rel(reservation_domain, repo_interfaces, "Utilise")
    Rel(repo_interfaces, eloquent_repos, "Implémenté par")
    Rel(game_domain, events, "Dispatch")
    Rel(events, jobs, "Déclenche")

Structure de dossiers

api/app/
├── Domain/
│   ├── Auth/
│   │   ├── DTOs/           # LoginDTO, RegisterDTO
│   │   ├── Events/         # UserRegistered
│   │   ├── Models/         # (User entity, pas Eloquent)
│   │   ├── Repositories/   # UserRepositoryInterface
│   │   └── Services/       # AuthService, TokenService
│   ├── Game/
│   │   ├── DTOs/           # CreateGameDTO, ScoreDTO
│   │   ├── Events/         # GameCompleted, ScoreValidated
│   │   ├── Models/         # Game, Score (Value Objects)
│   │   ├── Repositories/   # GameRepositoryInterface
│   │   └── Services/       # GameService
│   ├── Club/
│   │   └── ...             # ClubService, TerrainService
│   ├── Creneau/
│   │   └── ...             # CreneauService, CreneauRepositoryInterface
│   ├── Reservation/
│   │   └── ...             # ReservationService
│   └── Terrain/
│       └── ...             # TerrainService, TerrainRepositoryInterface
├── Http/
│   ├── Controllers/Api/V1/ # AuthController, GameController
│   ├── Requests/           # LoginRequest, CreateGameRequest
│   └── Resources/          # UserResource, GameResource
└── Infrastructure/
    └── Repositories/       # EloquentUserRepository, EloquentGameRepository

Règles d'architecture (enforced par Pest Arch)

Tests d'architecture

Ces règles sont vérifiées automatiquement via make test-arch

  • Domain/ ne doit PAS importer depuis Http/ ou Infrastructure/
  • Infrastructure/ peut importer depuis Domain/ (implement interfaces)
  • Http/ peut importer depuis Domain/ (use services)
  • Les Models Eloquent sont dans app/Models/, pas dans Domain/