From 003dee41cad2a5f3a08c2b354843012ea02534e2 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Mon, 28 Apr 2025 15:16:14 +0200 Subject: [PATCH] Skip dynamic entity class names in NoGetRepositoryOutsideServiceRule --- .../NoGetRepositoryOutsideServiceRule.php | 20 ++++++++++++++++++ .../Fixture/GetRepositoryRandomEntity.php | 21 +++++++++++++++++++ .../Fixture/SkipDymamicFetch.php | 18 ++++++++++++++++ .../NoGetRepositoryOutsideServiceRuleTest.php | 6 ++++++ 4 files changed, 65 insertions(+) create mode 100644 tests/Rules/Doctrine/NoGetRepositoryOutsideServiceRule/Fixture/GetRepositoryRandomEntity.php create mode 100644 tests/Rules/Doctrine/NoGetRepositoryOutsideServiceRule/Fixture/SkipDymamicFetch.php diff --git a/src/Rules/Doctrine/NoGetRepositoryOutsideServiceRule.php b/src/Rules/Doctrine/NoGetRepositoryOutsideServiceRule.php index fa2041a0f..5a6ffbc56 100644 --- a/src/Rules/Doctrine/NoGetRepositoryOutsideServiceRule.php +++ b/src/Rules/Doctrine/NoGetRepositoryOutsideServiceRule.php @@ -5,7 +5,9 @@ namespace Symplify\PHPStanRules\Rules\Doctrine; use PhpParser\Node; +use PhpParser\Node\Expr\ClassConstFetch; use PhpParser\Node\Expr\MethodCall; +use PhpParser\Node\Scalar\String_; use PHPStan\Analyser\Scope; use PHPStan\Rules\Rule; use PHPStan\Rules\RuleErrorBuilder; @@ -34,10 +36,18 @@ public function getNodeType(): string */ public function processNode(Node $node, Scope $scope): array { + if ($node->isFirstClassCallable()) { + return []; + } + if (! NamingHelper::isName($node->name, 'getRepository')) { return []; } + if ($this->isDynamicArg($node)) { + return []; + } + if (! $scope->isInClass()) { $ruleError = RuleErrorBuilder::message(self::ERROR_MESSAGE) ->identifier(DoctrineRuleIdentifier::NO_GET_REPOSITORY_OUTSIDE_SERVICE) @@ -58,4 +68,14 @@ public function processNode(Node $node, Scope $scope): array return [$ruleError]; } + + private function isDynamicArg(MethodCall $methodCall): bool + { + $firstArg = $methodCall->getArgs()[0]; + if ($firstArg->value instanceof String_) { + return false; + } + + return ! $firstArg->value instanceof ClassConstFetch; + } } diff --git a/tests/Rules/Doctrine/NoGetRepositoryOutsideServiceRule/Fixture/GetRepositoryRandomEntity.php b/tests/Rules/Doctrine/NoGetRepositoryOutsideServiceRule/Fixture/GetRepositoryRandomEntity.php new file mode 100644 index 000000000..c1f32f09b --- /dev/null +++ b/tests/Rules/Doctrine/NoGetRepositoryOutsideServiceRule/Fixture/GetRepositoryRandomEntity.php @@ -0,0 +1,21 @@ +entityManager->getRepository(SomeRandomEntity::class); + } +} diff --git a/tests/Rules/Doctrine/NoGetRepositoryOutsideServiceRule/Fixture/SkipDymamicFetch.php b/tests/Rules/Doctrine/NoGetRepositoryOutsideServiceRule/Fixture/SkipDymamicFetch.php new file mode 100644 index 000000000..a67658119 --- /dev/null +++ b/tests/Rules/Doctrine/NoGetRepositoryOutsideServiceRule/Fixture/SkipDymamicFetch.php @@ -0,0 +1,18 @@ +getRepository($className); + } +} diff --git a/tests/Rules/Doctrine/NoGetRepositoryOutsideServiceRule/NoGetRepositoryOutsideServiceRuleTest.php b/tests/Rules/Doctrine/NoGetRepositoryOutsideServiceRule/NoGetRepositoryOutsideServiceRuleTest.php index 5366d4c44..0622ee47d 100644 --- a/tests/Rules/Doctrine/NoGetRepositoryOutsideServiceRule/NoGetRepositoryOutsideServiceRuleTest.php +++ b/tests/Rules/Doctrine/NoGetRepositoryOutsideServiceRule/NoGetRepositoryOutsideServiceRuleTest.php @@ -28,7 +28,13 @@ public static function provideData(): Iterator 18, ]]]; + yield [__DIR__ . '/Fixture/GetRepositoryRandomEntity.php', [[ + NoGetRepositoryOutsideServiceRule::ERROR_MESSAGE, + 19, + ]]]; + yield [__DIR__ . '/Fixture/SkipInRepository.php', []]; + yield [__DIR__ . '/Fixture/SkipDymamicFetch.php', []]; } protected function getRule(): Rule