diff --git a/extension.neon b/extension.neon index 2604d095..2d097c23 100644 --- a/extension.neon +++ b/extension.neon @@ -10,6 +10,10 @@ conditionalTags: services: - class: PHPStan\Reflection\Doctrine\DoctrineSelectableClassReflectionExtension + - + class: PHPStan\Reflection\Doctrine\EntityRepositoryClassReflectionExtension + tags: + - phpstan.broker.methodsClassReflectionExtension - class: PHPStan\Type\Doctrine\DoctrineSelectableDynamicReturnTypeExtension tags: diff --git a/src/Reflection/Doctrine/EntityRepositoryClassReflectionExtension.php b/src/Reflection/Doctrine/EntityRepositoryClassReflectionExtension.php new file mode 100644 index 00000000..040a5443 --- /dev/null +++ b/src/Reflection/Doctrine/EntityRepositoryClassReflectionExtension.php @@ -0,0 +1,21 @@ +getName() === 'Doctrine\ORM\EntityRepository' + && (strpos($methodName, 'findBy') === 0 || strpos($methodName, 'findOneBy') === 0); + } + + public function getMethod(\PHPStan\Reflection\ClassReflection $classReflection, string $methodName): \PHPStan\Reflection\MethodReflection + { + return new DummyMethodReflection($methodName); + } + +} diff --git a/tests/Reflection/Doctrine/EntityRepositoryClassReflectionExtensionTest.php b/tests/Reflection/Doctrine/EntityRepositoryClassReflectionExtensionTest.php new file mode 100644 index 00000000..04c563aa --- /dev/null +++ b/tests/Reflection/Doctrine/EntityRepositoryClassReflectionExtensionTest.php @@ -0,0 +1,59 @@ +broker = $this->createBroker(); + $this->extension = new EntityRepositoryClassReflectionExtension(); + } + + /** + * @return mixed[] + */ + public function dataHasMethod(): array + { + return [ + [\Doctrine\ORM\EntityRepository::class, 'findBy', true], + [\Doctrine\ORM\EntityRepository::class, 'findByString', true], + [\Doctrine\ORM\EntityRepository::class, 'findOneByString', true], + [\Doctrine\ORM\EntityRepository::class, 'count', false], + [\Doctrine\ORM\EntityRepository::class, 'find', false], + [\Doctrine\ORM\EntityRepository::class, 'findAll', false], + ]; + } + + /** + * @dataProvider dataHasMethod + * + * @param string $className + * @param string $method + * @param bool $expectedResult + */ + public function testHasMethod(string $className, string $method, bool $expectedResult): void + { + $classReflection = $this->broker->getClass($className); + + self::assertSame($expectedResult, $this->extension->hasMethod($classReflection, $method)); + } + + public function testGetMethod(): void + { + $methodName = 'findOneByString'; + + $classReflection = $this->broker->getClass(\Doctrine\ORM\EntityRepository::class); + $methodReflection = $this->extension->getMethod($classReflection, $methodName); + + self::assertSame($methodName, $methodReflection->getName()); + } + +}