From fe92e53be7e2dd2aaffa2474d560bde79d2f93ed Mon Sep 17 00:00:00 2001 From: "ext.jeremy.guillot@maxicoffee.domains" Date: Sat, 22 Mar 2025 17:48:19 +0100 Subject: [PATCH] =?UTF-8?q?feat:=20suite=20des=20r=C3=AAgles=20de=20phpark?= =?UTF-8?q?itect=20+=20d=C3=A9but=20d'un=20domain=20Shared=20avec=20les=20?= =?UTF-8?q?interfaces=20CQRS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- phparkitect.php | 47 +++++++++---------- .../Contract/CommandHandlerInterface.php | 15 ++++++ .../Shared/Contract/CommandInterface.php | 9 ++++ .../Shared/Contract/QueryHandlerInterface.php | 16 +++++++ src/Domain/Shared/Contract/QueryInterface.php | 9 ++++ .../Shared/Contract/ResponseInterface.php | 9 ++++ 6 files changed, 81 insertions(+), 24 deletions(-) create mode 100644 src/Domain/Shared/Contract/CommandHandlerInterface.php create mode 100644 src/Domain/Shared/Contract/CommandInterface.php create mode 100644 src/Domain/Shared/Contract/QueryHandlerInterface.php create mode 100644 src/Domain/Shared/Contract/QueryInterface.php create mode 100644 src/Domain/Shared/Contract/ResponseInterface.php 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 @@ +