80 lines
3.2 KiB
PHP
80 lines
3.2 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
use Arkitect\ClassSet;
|
|
use Arkitect\CLI\Config;
|
|
use Arkitect\Expression\ForClasses\HaveNameMatching;
|
|
use Arkitect\Expression\ForClasses\NotDependsOnTheseNamespaces;
|
|
use Arkitect\Expression\ForClasses\NotHaveDependencyOutsideNamespace;
|
|
use Arkitect\Expression\ForClasses\ResideInOneOfTheseNamespaces;
|
|
use Arkitect\Rules\Rule;
|
|
|
|
return static function (Config $config): void {
|
|
$domainClassSet = ClassSet::fromDir(__DIR__ . '/src/Domain');
|
|
$domains = ['Manga', 'Reader', 'Scraping'];
|
|
|
|
// Classes PHP standards et utilitaires
|
|
$standardExceptions = [
|
|
'DateTimeImmutable',
|
|
'RuntimeException',
|
|
'Exception',
|
|
'DomainException',
|
|
'Symfony\Component\HttpKernel\Exception',
|
|
'Throwable',
|
|
'InvalidArgumentException',
|
|
];
|
|
|
|
// Dépendances externes autorisées
|
|
$externalDependencies = [
|
|
'Symfony\Component\Messenger',
|
|
'Ramsey\Uuid'
|
|
];
|
|
|
|
// Règle pour le namespace cohérent
|
|
$namespaceRule = Rule::allClasses()
|
|
->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);
|
|
};
|