From 90e8ae095d030aa7f2cefe473003c58ffe73d176 Mon Sep 17 00:00:00 2001 From: Jack Bentley Date: Wed, 26 Sep 2018 10:33:37 +0100 Subject: [PATCH 1/4] Add support for magic find* entity repository methods #35 --- ...tityRepositoryClassReflectionExtension.php | 21 +++++++ ...RepositoryClassReflectionExtensionTest.php | 59 +++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 src/Reflection/Doctrine/EntityRepositoryClassReflectionExtension.php create mode 100644 tests/Reflection/Doctrine/EntityRepositoryClassReflectionExtensionTest.php diff --git a/src/Reflection/Doctrine/EntityRepositoryClassReflectionExtension.php b/src/Reflection/Doctrine/EntityRepositoryClassReflectionExtension.php new file mode 100644 index 00000000..74918cb7 --- /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..7a28b1b9 --- /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()); + } + +} From a43d8a25006ce05ccc91094023c1ed71739828c6 Mon Sep 17 00:00:00 2001 From: Jack Bentley Date: Wed, 26 Sep 2018 10:40:05 +0100 Subject: [PATCH 2/4] Update extension.neon services --- extension.neon | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/extension.neon b/extension.neon index 21e8e248..bbc3a989 100644 --- a/extension.neon +++ b/extension.neon @@ -7,6 +7,10 @@ services: class: PHPStan\Reflection\Doctrine\DoctrineSelectableClassReflectionExtension tags: - phpstan.broker.methodsClassReflectionExtension + - + class: PHPStan\Reflection\Doctrine\EntityRepositoryClassReflectionExtension + tags: + - phpstan.broker.methodsClassReflectionExtension - class: PHPStan\Type\Doctrine\DoctrineSelectableDynamicReturnTypeExtension tags: From d863327eced04764a4e5943d0b08641ff4cdfffc Mon Sep 17 00:00:00 2001 From: Jack Bentley Date: Fri, 16 Nov 2018 12:43:30 +0000 Subject: [PATCH 3/4] Fix CS issues --- ...ntityRepositoryClassReflectionExtension.php | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Reflection/Doctrine/EntityRepositoryClassReflectionExtension.php b/src/Reflection/Doctrine/EntityRepositoryClassReflectionExtension.php index 74918cb7..040a5443 100644 --- a/src/Reflection/Doctrine/EntityRepositoryClassReflectionExtension.php +++ b/src/Reflection/Doctrine/EntityRepositoryClassReflectionExtension.php @@ -7,15 +7,15 @@ class EntityRepositoryClassReflectionExtension implements \PHPStan\Reflection\MethodsClassReflectionExtension { - public function hasMethod(\PHPStan\Reflection\ClassReflection $classReflection, string $methodName): bool - { - return $classReflection->getName() === 'Doctrine\ORM\EntityRepository' - && (strpos($methodName, 'findBy') === 0 || strpos($methodName, 'findOneBy') === 0); - } + public function hasMethod(\PHPStan\Reflection\ClassReflection $classReflection, string $methodName): bool + { + return $classReflection->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); - } + public function getMethod(\PHPStan\Reflection\ClassReflection $classReflection, string $methodName): \PHPStan\Reflection\MethodReflection + { + return new DummyMethodReflection($methodName); + } } From a867fabc99f8f19813185ec49a978bc6fede77a5 Mon Sep 17 00:00:00 2001 From: Jack Bentley Date: Fri, 16 Nov 2018 12:47:55 +0000 Subject: [PATCH 4/4] Fix CS issues --- ...yRepositoryClassReflectionExtensionTest.php | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/tests/Reflection/Doctrine/EntityRepositoryClassReflectionExtensionTest.php b/tests/Reflection/Doctrine/EntityRepositoryClassReflectionExtensionTest.php index 7a28b1b9..04c563aa 100644 --- a/tests/Reflection/Doctrine/EntityRepositoryClassReflectionExtensionTest.php +++ b/tests/Reflection/Doctrine/EntityRepositoryClassReflectionExtensionTest.php @@ -5,15 +5,15 @@ final class EntityRepositoryClassReflectionExtensionTest extends \PHPStan\Testing\TestCase { - /** @var \PHPStan\Broker\Broker */ - private $broker; + /** @var \PHPStan\Broker\Broker */ + private $broker; - /** @var \PHPStan\Reflection\Doctrine\EntityRepositoryClassReflectionExtension */ - private $extension; + /** @var \PHPStan\Reflection\Doctrine\EntityRepositoryClassReflectionExtension */ + private $extension; - protected function setUp(): void - { - $this->broker = $this->createBroker(); + protected function setUp(): void + { + $this->broker = $this->createBroker(); $this->extension = new EntityRepositoryClassReflectionExtension(); } @@ -34,7 +34,7 @@ public function dataHasMethod(): array /** * @dataProvider dataHasMethod - * + * * @param string $className * @param string $method * @param bool $expectedResult @@ -48,7 +48,7 @@ public function testHasMethod(string $className, string $method, bool $expectedR public function testGetMethod(): void { - $methodName = 'findOneByString'; + $methodName = 'findOneByString'; $classReflection = $this->broker->getClass(\Doctrine\ORM\EntityRepository::class); $methodReflection = $this->extension->getMethod($classReflection, $methodName);