From 036e081c7884817c641e9bece03f62791e3dbcae Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Wed, 23 Sep 2026 13:09:14 +0200 Subject: [PATCH] [doctrine] use test-container hint in NoGetRepositoryOutsideServiceRule for test classes --- phpstan.neon | 1 + .../NoGetRepositoryOutsideServiceRule.php | 7 ++++++- .../Fixture/GetRepositoryInsideContext.php | 21 +++++++++++++++++++ .../NoGetRepositoryOutsideServiceRuleTest.php | 5 +++++ 4 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 tests/Rules/Doctrine/NoGetRepositoryOutsideServiceRule/Fixture/GetRepositoryInsideContext.php diff --git a/phpstan.neon b/phpstan.neon index b25bfb07..d494566a 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -41,6 +41,7 @@ parameters: # used in tests - '#Public constant "Symplify\\PHPStanRules\\(.*?)Rule\:\:ERROR_MESSAGE" is never used#' + - '#Public constant "Symplify\\PHPStanRules\\(.*?)Rule\:\:TEST_ERROR_MESSAGE" is never used#' - message: '#Generator expects value type array, list\|PHPStan\\TrinaryLogic\|string\|null> given#' diff --git a/src/Rules/Doctrine/NoGetRepositoryOutsideServiceRule.php b/src/Rules/Doctrine/NoGetRepositoryOutsideServiceRule.php index 4ee38b34..32bd498c 100644 --- a/src/Rules/Doctrine/NoGetRepositoryOutsideServiceRule.php +++ b/src/Rules/Doctrine/NoGetRepositoryOutsideServiceRule.php @@ -15,6 +15,7 @@ use PHPStan\Rules\RuleErrorBuilder; use Symplify\PHPStanRules\Enum\RuleIdentifier\DoctrineRuleIdentifier; use Symplify\PHPStanRules\Helper\NamingHelper; +use Symplify\PHPStanRules\PHPUnit\TestClassDetector; /** * @see \Symplify\PHPStanRules\Tests\Rules\Doctrine\NoGetRepositoryOutsideServiceRule\NoGetRepositoryOutsideServiceRuleTest @@ -25,6 +26,8 @@ final class NoGetRepositoryOutsideServiceRule implements Rule { public const string ERROR_MESSAGE = 'Instead of getting repository from EntityManager, use constructor injection and service pattern to keep code clean'; + public const string TEST_ERROR_MESSAGE = 'Instead of getting repository from EntityManager, fetch the repository service directly from the test container'; + public function getNodeType(): string { return MethodCall::class; @@ -61,7 +64,9 @@ public function processNode(Node $node, Scope $scope): array return []; } - $ruleError = RuleErrorBuilder::message(self::ERROR_MESSAGE) + $errorMessage = TestClassDetector::isTestClass($scope) ? self::TEST_ERROR_MESSAGE : self::ERROR_MESSAGE; + + $ruleError = RuleErrorBuilder::message($errorMessage) ->identifier(DoctrineRuleIdentifier::NO_GET_REPOSITORY_OUTSIDE_SERVICE) ->build(); diff --git a/tests/Rules/Doctrine/NoGetRepositoryOutsideServiceRule/Fixture/GetRepositoryInsideContext.php b/tests/Rules/Doctrine/NoGetRepositoryOutsideServiceRule/Fixture/GetRepositoryInsideContext.php new file mode 100644 index 00000000..e4384450 --- /dev/null +++ b/tests/Rules/Doctrine/NoGetRepositoryOutsideServiceRule/Fixture/GetRepositoryInsideContext.php @@ -0,0 +1,21 @@ +entityManager->getRepository(SomeRandomEntity::class); + } +} diff --git a/tests/Rules/Doctrine/NoGetRepositoryOutsideServiceRule/NoGetRepositoryOutsideServiceRuleTest.php b/tests/Rules/Doctrine/NoGetRepositoryOutsideServiceRule/NoGetRepositoryOutsideServiceRuleTest.php index fc7e48b7..6cba22b4 100644 --- a/tests/Rules/Doctrine/NoGetRepositoryOutsideServiceRule/NoGetRepositoryOutsideServiceRuleTest.php +++ b/tests/Rules/Doctrine/NoGetRepositoryOutsideServiceRule/NoGetRepositoryOutsideServiceRuleTest.php @@ -36,6 +36,11 @@ public static function provideData(): Iterator 19, ]]]; + yield [__DIR__ . '/Fixture/GetRepositoryInsideContext.php', [[ + NoGetRepositoryOutsideServiceRule::TEST_ERROR_MESSAGE, + 19, + ]]]; + yield [__DIR__ . '/Fixture/SkipInRepository.php', []]; yield [__DIR__ . '/Fixture/SkipDynamicFetch.php', []]; yield [__DIR__ . '/Fixture/SkipDynamicClassConstFetch.php', []];