Files
Mangarr/phparkitect.php
2025-03-22 17:16:26 +01:00

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);
};