that(new ResideInOneOfTheseNamespaces('App\Domain')) ->should(new HaveNameMatching('*')) ->because('nous voulons un namespace cohérent pour notre domaine'); $rules = [$namespaceRule]; // Les classes de Application ne doivent pas dépendre de l'infrastructure $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' )) ->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); // 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"); // 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) )) ->because("la couche Application de $domain ne peut dépendre que de son propre domaine et des dépendances autorisées"); } $config->add($domainClassSet, ...$rules); };