Aller au contenu

Ajouter un nouveau domaine DDD

Guide pas à pas pour créer un nouveau domaine DDD dans Primatch. Exemple : ajouter le domaine Feedback.


1. Créer la structure de dossiers

mkdir -p api/app/Domain/Feedback/{DTOs,Events,Models,Repositories,Services}

2. Créer l'interface Repository (Domain)

<?php
// app/Domain/Feedback/Repositories/FeedbackRepositoryInterface.php

namespace App\Domain\Feedback\Repositories;

use App\Models\User;

interface FeedbackRepositoryInterface
{
    public function getByGame(int $gameId): array;
    public function getByUser(int $userId): array;
    public function submitFeedback(int $userId, int $gameId, array $data): void;
}

3. Créer le Service métier (Domain)

<?php
// app/Domain/Feedback/Services/FeedbackService.php

namespace App\Domain\Feedback\Services;

use App\Domain\Feedback\Repositories\FeedbackRepositoryInterface;

final class FeedbackService
{
    public function __construct(
        private readonly FeedbackRepositoryInterface $feedbackRepository,
    ) {}

    public function submitFeedback(int $userId, int $gameId, int $rating, ?string $comment): void
    {
        $this->feedbackRepository->submitFeedback($userId, $gameId, [
            'rating'  => $rating,
            'comment' => $comment,
        ]);
    }
}

4. Créer l'implémentation Eloquent (Infrastructure)

<?php
// app/Infrastructure/Repositories/EloquentFeedbackRepository.php

namespace App\Infrastructure\Repositories;

use App\Domain\Feedback\Repositories\FeedbackRepositoryInterface;
use App\Models\Feedback;

final class EloquentFeedbackRepository implements FeedbackRepositoryInterface
{
    public function submitFeedback(int $userId, int $gameId, array $data): void
    {
        Feedback::create([
            'user_id' => $userId,
            'game_id' => $gameId,
            ...$data,
        ]);
    }

    // ...
}

5. Lier interface ↔ implémentation

// app/Providers/AppServiceProvider.php
use App\Domain\Feedback\Repositories\FeedbackRepositoryInterface;
use App\Infrastructure\Repositories\EloquentFeedbackRepository;

$this->app->bind(FeedbackRepositoryInterface::class, EloquentFeedbackRepository::class);

6. Créer le Controller et les routes

// app/Http/Controllers/Api/V1/FeedbackController.php
// routes/api.php : Route::post('/feedback', [FeedbackController::class, 'store']);

7. Écrire les tests

# Créer les fichiers de test
touch tests/Unit/Domain/Feedback/FeedbackServiceTest.php
touch tests/Feature/Api/V1/Feedback/SubmitFeedbackTest.php

8. Documenter

  • Ajouter les règles métier dans docs/content/2-fonctionnel/feedback/regles-metier.md
  • Ajouter les cas d'utilisation dans docs/content/2-fonctionnel/feedback/cas-utilisation.md
  • Mettre à jour la carte des domaines docs/content/3-architecture/domaines-ddd.md
  • Mettre à jour mkdocs.yml avec les nouvelles pages
  • Mettre à jour le glossaire si de nouveaux termes métier apparaissent
  • Annoter le Controller avec Swagger et régénérer (make swagger-generate)