diff --git a/src/Rules/Doctrine/RequireQueryBuilderOnRepositoryRule.php b/src/Rules/Doctrine/RequireQueryBuilderOnRepositoryRule.php index 75560a87c..3306838cc 100644 --- a/src/Rules/Doctrine/RequireQueryBuilderOnRepositoryRule.php +++ b/src/Rules/Doctrine/RequireQueryBuilderOnRepositoryRule.php @@ -22,7 +22,7 @@ final class RequireQueryBuilderOnRepositoryRule implements Rule /** * @var string */ - private const ERROR_MESSAGE = 'Avoid calling ->createQueryBuilder() directly on EntityManager as it requires select() + from() calls with specific values. Use $repository->createQueryBuilder() to be safe instead'; + public const ERROR_MESSAGE = 'Avoid calling ->createQueryBuilder() directly on EntityManager as it requires select() + from() calls with specific values. Use $repository->createQueryBuilder() to be safe instead'; public function getNodeType(): string { diff --git a/stubs/Doctrine/ORM/EntityManagerInterface.php b/stubs/Doctrine/ORM/EntityManagerInterface.php index 1152946b4..c38ecc95a 100644 --- a/stubs/Doctrine/ORM/EntityManagerInterface.php +++ b/stubs/Doctrine/ORM/EntityManagerInterface.php @@ -8,5 +8,11 @@ interface EntityManagerInterface { + /** + * @param class-string $class + * @return EntityRepository + */ public function getRepository(string $class): object; + + public function createQueryBuilder(); } diff --git a/stubs/Doctrine/ORM/EntityRepository.php b/stubs/Doctrine/ORM/EntityRepository.php index 7304dee3f..8e117539a 100644 --- a/stubs/Doctrine/ORM/EntityRepository.php +++ b/stubs/Doctrine/ORM/EntityRepository.php @@ -8,4 +8,7 @@ class EntityRepository { + public function createQueryBuilder() + { + } } diff --git a/tests/Rules/Doctrine/RequireQueryBuilderOnRepositoryRule/Fixture/ReportOnEntityManager.php b/tests/Rules/Doctrine/RequireQueryBuilderOnRepositoryRule/Fixture/ReportOnEntityManager.php new file mode 100644 index 000000000..55352a7ca --- /dev/null +++ b/tests/Rules/Doctrine/RequireQueryBuilderOnRepositoryRule/Fixture/ReportOnEntityManager.php @@ -0,0 +1,16 @@ +createQueryBuilder(); + } +} diff --git a/tests/Rules/Doctrine/RequireQueryBuilderOnRepositoryRule/Fixture/SkipCreateQueryBuilderOnRepository.php b/tests/Rules/Doctrine/RequireQueryBuilderOnRepositoryRule/Fixture/SkipCreateQueryBuilderOnRepository.php new file mode 100644 index 000000000..5a3e83030 --- /dev/null +++ b/tests/Rules/Doctrine/RequireQueryBuilderOnRepositoryRule/Fixture/SkipCreateQueryBuilderOnRepository.php @@ -0,0 +1,25 @@ +getRepository(RandomEntity::class); + + $queryBuilder = $someRepository + ->createQueryBuilder(); + } + + public function directlyOnCall(EntityManagerInterface $entityManager) + { + $queryBuilder = $entityManager->getRepository(RandomEntity::class) + ->createQueryBuilder(); + } +} diff --git a/tests/Rules/Doctrine/RequireQueryBuilderOnRepositoryRule/RequireQueryBuilderOnRepositoryRuleTest.php b/tests/Rules/Doctrine/RequireQueryBuilderOnRepositoryRule/RequireQueryBuilderOnRepositoryRuleTest.php new file mode 100644 index 000000000..05e8c6a33 --- /dev/null +++ b/tests/Rules/Doctrine/RequireQueryBuilderOnRepositoryRule/RequireQueryBuilderOnRepositoryRuleTest.php @@ -0,0 +1,34 @@ +analyse([$filePath], $expectedErrorsWithLines); + } + + public static function provideData(): Iterator + { + yield [__DIR__ . '/Fixture/SkipCreateQueryBuilderOnRepository.php', []]; + + yield [__DIR__ . '/Fixture/ReportOnEntityManager.php', [ + [RequireQueryBuilderOnRepositoryRule::ERROR_MESSAGE, 14], + ]]; + } + + protected function getRule(): Rule + { + return new RequireQueryBuilderOnRepositoryRule(); + } +} diff --git a/tests/Rules/Doctrine/RequireQueryBuilderOnRepositoryRule/Source/RandomEntity.php b/tests/Rules/Doctrine/RequireQueryBuilderOnRepositoryRule/Source/RandomEntity.php new file mode 100644 index 000000000..c780f4673 --- /dev/null +++ b/tests/Rules/Doctrine/RequireQueryBuilderOnRepositoryRule/Source/RandomEntity.php @@ -0,0 +1,8 @@ +