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¶
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.ymlavec 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)