From 933f193dd7511f29619c61e5bc9bbd076b34272c Mon Sep 17 00:00:00 2001 From: Josha von Gizycki Date: Sun, 25 Oct 2026 20:04:09 +0100 Subject: [PATCH] refactor analyze results, work out cyclic dependencies --- deptrac.php | 17 +++++-- src/Analyze/RepositoryAnalyzer.php | 17 +------ src/Analyze/Result/RepositoryMethod.php | 11 +---- src/Analyze/Result/RepositoryResult.php | 2 + src/Repository/Repository.php | 9 ++-- .../ResolutionStrategyFactory.php | 19 +++++--- .../ResolutionStrategy/FindAllTest.php | 5 +- .../ResolutionStrategy/FindByIdTest.php | 9 ++-- .../ResolutionStrategyFactoryTest.php | 46 +++++++++++++------ .../ResolutionStrategy/SaveEntityTest.php | 6 +-- 10 files changed, 76 insertions(+), 65 deletions(-) diff --git a/deptrac.php b/deptrac.php index 35bb0e2..addaf30 100644 --- a/deptrac.php +++ b/deptrac.php @@ -17,7 +17,10 @@ return static function (DeptracConfig $config): void { $analyzePublic = Layer::withName('AnalyzePublic') ->collectors( ClassLikeConfig::create('Kartierung\\Analyze\\Exception\\.+'), - ClassLikeConfig::create('Kartierung\\Analyze\\Result\\.+') + ClassLikeConfig::create('Kartierung\\Analyze\\Result\\.+'), + ClassLikeConfig::create('Kartierung\\Analyze\\RepositoryAnalyzer'), + ClassLikeConfig::create('Kartierung\\Analyze\\EntityAnalyzer'), + ClassLikeConfig::create('Kartierung\\Analyze\\RecursionCheck') ), $analyze = Layer::withName('Analyze') ->collectors( @@ -30,12 +33,20 @@ return static function (DeptracConfig $config): void { ), $attribute = Layer::withName('Attribute') ->collectors( - ClassLikeConfig::create('Kartierung\\Attribute\\.*'), + ClassLikeConfig::create('Kartierung\\Attribute\\.+'), ), + $repository = Layer::withName('Repository') + ->collectors( + ClassLikeConfig::create('Kartierung\\Repository\\.+') + ) ) ->rulesets( Ruleset::forLayer($analyze) + ->accesses($attribute), + Ruleset::forLayer($analyzePublic) ->accesses($attribute) - ->accesses($analyzePublic), + ->accesses($analyze), + Ruleset::forLayer($repository) + ->accesses($analyzePublic) ); }; diff --git a/src/Analyze/RepositoryAnalyzer.php b/src/Analyze/RepositoryAnalyzer.php index 393ddfd..40890d9 100644 --- a/src/Analyze/RepositoryAnalyzer.php +++ b/src/Analyze/RepositoryAnalyzer.php @@ -11,7 +11,6 @@ use Kartierung\Analyze\Result\RepositoryMethodParameter; use Kartierung\Analyze\Result\RepositoryResult; use Kartierung\Attribute\ListOf; use Kartierung\Attribute\Query; -use Kartierung\Repository\ResolutionStrategy\ResolutionStrategyFactory; use ReflectionClass; use ReflectionIntersectionType; use ReflectionMethod; @@ -23,11 +22,6 @@ use ReflectionUnionType; */ readonly class RepositoryAnalyzer { - - public function __construct( - private ResolutionStrategyFactory $methodValidator - ) {} - /** * @param class-string $repositoryClass * @noinspection PhpDocMissingThrowsInspection @@ -40,6 +34,7 @@ readonly class RepositoryAnalyzer $refClass = new ReflectionClass($repositoryClass); return new RepositoryResult( + repoFqcn: $repositoryClass, methods: $this->methods($refClass) ); } @@ -60,15 +55,6 @@ readonly class RepositoryAnalyzer $params = $this->parameters($refMethod); $name = $refMethod->name; - $resolutionStrategy = $this->methodValidator->forRepositoryMethod( - repName: $refClass->name, - methodName: $name, - query: $query, - returnType: $returnType, - returnsNullable: $returnsNullable, - listType: $listType, - params: $params - ); $methods[$refMethod->name] = new RepositoryMethod( query: $query, @@ -77,7 +63,6 @@ readonly class RepositoryAnalyzer returnListType: $listType, name: $name, parameters: $params, - resolutionStrategy: $resolutionStrategy ); } diff --git a/src/Analyze/Result/RepositoryMethod.php b/src/Analyze/Result/RepositoryMethod.php index 93c9c3b..872fb24 100644 --- a/src/Analyze/Result/RepositoryMethod.php +++ b/src/Analyze/Result/RepositoryMethod.php @@ -19,15 +19,6 @@ readonly class RepositoryMethod public bool $returnsNullable, public ?string $returnListType, public string $name, - public array $parameters, - public ResolutionStrategy $resolutionStrategy + public array $parameters ) {} - - /** - * @param array $parameters - */ - public function createQuery(array $parameters): LazyQuery - { - return $this->resolutionStrategy->createQuery($this, $parameters); - } } diff --git a/src/Analyze/Result/RepositoryResult.php b/src/Analyze/Result/RepositoryResult.php index 989b1ca..6820327 100644 --- a/src/Analyze/Result/RepositoryResult.php +++ b/src/Analyze/Result/RepositoryResult.php @@ -7,9 +7,11 @@ namespace Kartierung\Analyze\Result; readonly class RepositoryResult { /** + * @param class-string $repoFqcn * @param array $methods */ public function __construct( + public string $repoFqcn, public array $methods ) {} } diff --git a/src/Repository/Repository.php b/src/Repository/Repository.php index d6fa84d..e130c60 100644 --- a/src/Repository/Repository.php +++ b/src/Repository/Repository.php @@ -23,8 +23,7 @@ readonly class Repository */ public function ofType(string $clazz): object { - $resolutionStrategyFactory = new ResolutionStrategyFactory(); - $repoResult = (new RepositoryAnalyzer($resolutionStrategyFactory))->analyze($clazz); + $repoResult = (new RepositoryAnalyzer())->analyze($clazz); /** * @var R $proxy @@ -46,7 +45,11 @@ readonly class Repository $repoMethod = $this->repoResult->methods[$methodName]; $queryArgs = $this->callArgsToQueryArgs($repoMethod, $arguments); - $query = $repoMethod->createQuery($queryArgs); + $strategy = (new ResolutionStrategyFactory())->forRepositoryMethod( + $this->repoResult, + $repoMethod + ); + $query = $strategy->createQuery($repoMethod, $queryArgs); return $query->execute($this->pdo); } diff --git a/src/Repository/ResolutionStrategy/ResolutionStrategyFactory.php b/src/Repository/ResolutionStrategy/ResolutionStrategyFactory.php index 79ef2c4..12b2cb2 100644 --- a/src/Repository/ResolutionStrategy/ResolutionStrategyFactory.php +++ b/src/Repository/ResolutionStrategy/ResolutionStrategyFactory.php @@ -5,6 +5,8 @@ declare(strict_types=1); namespace Kartierung\Repository\ResolutionStrategy; use Kartierung\Analyze\Exception\InvalidRepository; +use Kartierung\Analyze\Result\RepositoryMethod; +use Kartierung\Analyze\Result\RepositoryResult; class ResolutionStrategyFactory { @@ -13,17 +15,20 @@ class ResolutionStrategyFactory * @param class-string|null $listType */ public function forRepositoryMethod( - string $repName, - string $methodName, - ?string $query, - string $returnType, - bool $returnsNullable, - ?string $listType, - array $params + RepositoryResult $repositoryResult, + RepositoryMethod $method, ): ResolutionStrategy { + $params = $method->parameters; $oneParam = count($params) === 1; + $query = $method->query; + $methodName = $method->name; + $returnType = $method->returnType; + $returnsNullable = $method->returnsNullable; + $listType = $method->returnListType; + $repName = $repositoryResult->repoFqcn; + return match (true) { $query !== null => new UserDefinedQuery(), diff --git a/tests/Repository/ResolutionStrategy/FindAllTest.php b/tests/Repository/ResolutionStrategy/FindAllTest.php index 6e00170..14ef79a 100644 --- a/tests/Repository/ResolutionStrategy/FindAllTest.php +++ b/tests/Repository/ResolutionStrategy/FindAllTest.php @@ -37,10 +37,9 @@ class FindAllTest extends SqliteBaseCase returnsNullable: true, returnListType: SimpleEntity::class, name: '', - parameters: [], - resolutionStrategy: new FindAll() + parameters: [] ); - $query = $method->createQuery([]); + $query = (new FindAll())->createQuery($method, []); // When $result = $query->execute($this->getPdo()); diff --git a/tests/Repository/ResolutionStrategy/FindByIdTest.php b/tests/Repository/ResolutionStrategy/FindByIdTest.php index 1b7c04d..541286a 100644 --- a/tests/Repository/ResolutionStrategy/FindByIdTest.php +++ b/tests/Repository/ResolutionStrategy/FindByIdTest.php @@ -39,9 +39,8 @@ class FindByIdTest extends SqliteBaseCase returnListType: '', name: '', parameters: [], - resolutionStrategy: $findBy ); - $query = $method->createQuery([1]); + $query = $findBy->createQuery($method, [1]); // When $result = $query->execute($this->getPdo()); @@ -65,9 +64,8 @@ class FindByIdTest extends SqliteBaseCase returnListType: '', name: '', parameters: [], - resolutionStrategy: $findBy ); - $query = $method->createQuery([3]); + $query = $findBy->createQuery($method, [3]); // When $result = $query->execute($this->getPdo()); @@ -91,9 +89,8 @@ class FindByIdTest extends SqliteBaseCase returnListType: '', name: '', parameters: [], - resolutionStrategy: $findBy ); - $query = $method->createQuery([4]); + $query = $findBy->createQuery($method, [4]); // When $result = $query->execute($this->getPdo()); diff --git a/tests/Repository/ResolutionStrategy/ResolutionStrategyFactoryTest.php b/tests/Repository/ResolutionStrategy/ResolutionStrategyFactoryTest.php index 1110809..f6d10bb 100644 --- a/tests/Repository/ResolutionStrategy/ResolutionStrategyFactoryTest.php +++ b/tests/Repository/ResolutionStrategy/ResolutionStrategyFactoryTest.php @@ -4,6 +4,8 @@ declare(strict_types=1); namespace Kartierung\Repository\ResolutionStrategy; +use Kartierung\Analyze\Result\RepositoryMethod; +use Kartierung\Analyze\Result\RepositoryResult; use Kartierung\FullEntity; use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; @@ -33,15 +35,24 @@ class ResolutionStrategyFactoryTest extends TestCase string $strategyClass ): void { - // When - $function = (new ResolutionStrategyFactory())->forRepositoryMethod( - repName: $repName, - methodName: $name, + // Given + $method = new RepositoryMethod( query: $query, returnType: $returnType, returnsNullable: $returnsNullable, - listType: $listType, - params: $params + returnListType: $listType, + name: $name, + parameters: $params + ); + $repositoryResult = new RepositoryResult( + '', + [$method] + ); + + // When + $function = (new ResolutionStrategyFactory())->forRepositoryMethod( + $repositoryResult, + $method ); // Then @@ -69,15 +80,24 @@ class ResolutionStrategyFactoryTest extends TestCase string $strategyClass ): void { - // When - $function = (new ResolutionStrategyFactory())->forRepositoryMethod( - repName: $repName, - methodName: $name, + // Given + $method = new RepositoryMethod( query: $query, returnType: $returnType, - returnsNullable: false, - listType: $listType, - params: $params + returnsNullable: true, + returnListType: $listType, + name: $name, + parameters: $params + ); + $repositoryResult = new RepositoryResult( + '', + [$method] + ); + + // When + $function = (new ResolutionStrategyFactory())->forRepositoryMethod( + $repositoryResult, + $method ); // Then diff --git a/tests/Repository/ResolutionStrategy/SaveEntityTest.php b/tests/Repository/ResolutionStrategy/SaveEntityTest.php index 7570322..0235420 100644 --- a/tests/Repository/ResolutionStrategy/SaveEntityTest.php +++ b/tests/Repository/ResolutionStrategy/SaveEntityTest.php @@ -47,10 +47,9 @@ class SaveEntityTest extends SqliteBaseCase function: ParameterFunction::STATEMENT_PARAMETER ) ], - resolutionStrategy: $strategy ); $entity = new SimpleEntity(null, 'foobar'); - $query = $method->createQuery([$entity]); + $query = $strategy->createQuery($method, [$entity]); // When $result = $query->execute($this->getPdo()); @@ -83,10 +82,9 @@ class SaveEntityTest extends SqliteBaseCase function: ParameterFunction::STATEMENT_PARAMETER ) ], - resolutionStrategy: $strategy ); $entity = new SimpleEntity(1, 'foobar'); - $query = $method->createQuery([$entity]); + $query = $strategy->createQuery($method, [$entity]); // When $result = $query->execute($this->getPdo());