feat: ajout de phparkitect + début de config pour les domains
This commit is contained in:
parent
4f4f86fb91
commit
e444d79101
80
phparkitect.php
Normal file
80
phparkitect.php
Normal file
@@ -0,0 +1,80 @@
|
||||
<?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);
|
||||
};
|
||||
Reference in New Issue
Block a user