diff --git a/phparkitect.php b/phparkitect.php index 5645c73..b43533f 100644 --- a/phparkitect.php +++ b/phparkitect.php @@ -12,7 +12,7 @@ use Arkitect\Rules\Rule; return static function (Config $config): void { $domainClassSet = ClassSet::fromDir(__DIR__ . '/src/Domain'); - $domains = ['Manga', 'Reader', 'Scraping']; + $businessDomains = ['Manga', 'Reader', 'Scraping']; // Classes PHP standards et utilitaires $standardExceptions = [ @@ -39,42 +39,41 @@ return static function (Config $config): void { $rules = [$namespaceRule]; - // Les classes de Application ne doivent pas dépendre de l'infrastructure + // Règles spécifiques pour le domaine Shared $rules[] = Rule::allClasses() - ->that(new ResideInOneOfTheseNamespaces('App\Domain\*\Application')) - ->should(new NotDependsOnTheseNamespaces('App\Domain\*\Infrastructure')) - ->because('la couche Application ne doit pas dépendre de l\'infrastructure'); - - // Les classes de Domain ne doivent pas dépendre de l'infrastructure ou de l'application - $rules[] = Rule::allClasses() - ->that(new ResideInOneOfTheseNamespaces('App\Domain\*\Domain')) - ->should(new NotDependsOnTheseNamespaces( - 'App\Domain\*\Infrastructure', - 'App\Domain\*\Application' + ->that(new ResideInOneOfTheseNamespaces('App\Domain\Shared')) + ->should(new NotHaveDependencyOutsideNamespace( + 'App\Domain\Shared', + $standardExceptions )) - ->because('la couche Domain ne doit pas dépendre de l\'infrastructure ou de l\'application'); - - // Génération des règles pour chaque domaine - foreach ($domains as $domain) { - // Récupération des autres domaines - $otherDomains = array_filter($domains, fn($d) => $d !== $domain); - $otherDomainsNamespaces = array_map(fn($d) => "App\Domain\\$d\*", $otherDomains); + ->because('le domaine Shared ne doit dépendre de personne'); + // Génération des règles pour chaque domaine métier + foreach ($businessDomains as $domain) { // Règle pour la couche Domain $rules[] = Rule::allClasses() ->that(new ResideInOneOfTheseNamespaces("App\Domain\\$domain\Domain")) - ->should(new NotHaveDependencyOutsideNamespace("App\Domain\\$domain\Domain", $standardExceptions)) - ->because("la couche Domain de $domain ne doit dépendre que de ses propres classes et des exceptions autorisées"); + ->should(new NotHaveDependencyOutsideNamespace( + "App\Domain\\$domain\Domain", + $standardExceptions + )) + ->because("la couche Domain de $domain ne doit dépendre que de ses propres classes, des contrats partagés et des exceptions autorisées"); // Règle pour la couche Application $rules[] = Rule::allClasses() ->that(new ResideInOneOfTheseNamespaces("App\Domain\\$domain\Application")) ->should(new NotHaveDependencyOutsideNamespace( "App\Domain\\$domain", - array_merge($standardExceptions, $externalDependencies) + array_merge($standardExceptions, $externalDependencies, ['App\Domain\Shared\Contract']) )) - ->because("la couche Application de $domain ne peut dépendre que de son propre domaine et des dépendances autorisées"); + ->because("la couche Application de $domain ne peut dépendre que de son propre domaine, des contrats partagés et des dépendances autorisées"); + + // Interdiction explicite pour l'Application d'accéder à l'Infrastructure + $rules[] = Rule::allClasses() + ->that(new ResideInOneOfTheseNamespaces("App\Domain\\$domain\Application")) + ->should(new NotDependsOnTheseNamespaces("App\Domain\\$domain\Infrastructure")) + ->because("la couche Application de $domain ne doit jamais dépendre de l'Infrastructure, même au sein de son propre domaine"); } $config->add($domainClassSet, ...$rules); -}; \ No newline at end of file +}; diff --git a/src/Domain/Shared/Contract/CommandHandlerInterface.php b/src/Domain/Shared/Contract/CommandHandlerInterface.php new file mode 100644 index 0000000..99f8903 --- /dev/null +++ b/src/Domain/Shared/Contract/CommandHandlerInterface.php @@ -0,0 +1,15 @@ +