From aa40f66f988382161539f35830d671931c92c3fa Mon Sep 17 00:00:00 2001 From: Alexander Schranz Date: Tue, 23 Oct 2018 20:42:39 +0200 Subject: [PATCH 1/7] added custom repository class support --- ...etRepositoryDynamicReturnTypeExtension.php | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/Type/Doctrine/EntityManagerGetRepositoryDynamicReturnTypeExtension.php b/src/Type/Doctrine/EntityManagerGetRepositoryDynamicReturnTypeExtension.php index b383c18f..a166f298 100644 --- a/src/Type/Doctrine/EntityManagerGetRepositoryDynamicReturnTypeExtension.php +++ b/src/Type/Doctrine/EntityManagerGetRepositoryDynamicReturnTypeExtension.php @@ -16,9 +16,17 @@ class EntityManagerGetRepositoryDynamicReturnTypeExtension implements \PHPStan\T /** @var string */ private $repositoryClass; - public function __construct(string $repositoryClass) + /** @var string */ + private $repositoryPattern; + + /** @var string */ + private $repositoryReplace; + + public function __construct(string $repositoryClass, string $repositoryPattern, string $repositoryReplace) { $this->repositoryClass = $repositoryClass; + $this->repositoryPattern = $repositoryPattern; + $this->repositoryReplace = $repositoryReplace; } public function getClass(): string @@ -42,12 +50,20 @@ public function getTypeFromMethodCall( $methodReflection->getVariants() )->getReturnType(); } + $argType = $scope->getType($methodCall->args[0]->value); + if (!$argType instanceof ConstantStringType) { return new MixedType(); } - return new EntityRepositoryType($argType->getValue(), $this->repositoryClass); + $repositoryClass = preg_replace($this->repositoryPattern, $this->repositoryReplace, $argType->getValue()); + + if (!class_exists($repositoryClass)) { + $repositoryClass = $this->repositoryClass; + } + + return new EntityRepositoryType($argType->getValue(), $repositoryClass); } } From 5b310dee56e144980b0759ed275477d356247ce3 Mon Sep 17 00:00:00 2001 From: Alexander Schranz Date: Tue, 23 Oct 2018 20:43:17 +0200 Subject: [PATCH 2/7] added custom repository class support --- extension.neon | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/extension.neon b/extension.neon index 21e8e248..0fc9c723 100644 --- a/extension.neon +++ b/extension.neon @@ -1,6 +1,8 @@ parameters: doctrine: repositoryClass: Doctrine\ORM\EntityRepository + repositoryPattern: /(.*)(Entity)(.*)/ + repositoryReplace: $1Repository$3Repository services: - @@ -19,6 +21,8 @@ services: class: PHPStan\Type\Doctrine\EntityManagerGetRepositoryDynamicReturnTypeExtension arguments: repositoryClass: %doctrine.repositoryClass% + repositoryPattern: %doctrine.repositoryPattern% + repositoryReplace: %doctrine.repositoryReplace% tags: - phpstan.broker.dynamicMethodReturnTypeExtension - From 5286fae854e86b2765baf6f56b71b053be358c4b Mon Sep 17 00:00:00 2001 From: Alexander Schranz Date: Tue, 23 Oct 2018 20:45:47 +0200 Subject: [PATCH 3/7] fixed parameters --- extension.neon | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extension.neon b/extension.neon index 0fc9c723..2ae98597 100644 --- a/extension.neon +++ b/extension.neon @@ -1,8 +1,8 @@ parameters: doctrine: repositoryClass: Doctrine\ORM\EntityRepository - repositoryPattern: /(.*)(Entity)(.*)/ - repositoryReplace: $1Repository$3Repository + repositoryPattern: "/(.*)(Entity)(.*)/" + repositoryReplace: "$1Repository$3Repository" services: - From 7d1b8e5e031eb26ea91dd7616f0085e810dbfea5 Mon Sep 17 00:00:00 2001 From: Alexander Schranz Date: Tue, 23 Oct 2018 20:50:06 +0200 Subject: [PATCH 4/7] check for empty repository class --- .../EntityManagerGetRepositoryDynamicReturnTypeExtension.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Type/Doctrine/EntityManagerGetRepositoryDynamicReturnTypeExtension.php b/src/Type/Doctrine/EntityManagerGetRepositoryDynamicReturnTypeExtension.php index a166f298..2c7a4835 100644 --- a/src/Type/Doctrine/EntityManagerGetRepositoryDynamicReturnTypeExtension.php +++ b/src/Type/Doctrine/EntityManagerGetRepositoryDynamicReturnTypeExtension.php @@ -59,7 +59,7 @@ public function getTypeFromMethodCall( $repositoryClass = preg_replace($this->repositoryPattern, $this->repositoryReplace, $argType->getValue()); - if (!class_exists($repositoryClass)) { + if (!$repositoryClass || !class_exists($repositoryClass)) { $repositoryClass = $this->repositoryClass; } From dfecef4e2e0b09bbad6ed9e0ee7bdbc839039a99 Mon Sep 17 00:00:00 2001 From: Alexander Schranz Date: Tue, 23 Oct 2018 20:50:39 +0200 Subject: [PATCH 5/7] remove accidentally added lines --- .../EntityManagerGetRepositoryDynamicReturnTypeExtension.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Type/Doctrine/EntityManagerGetRepositoryDynamicReturnTypeExtension.php b/src/Type/Doctrine/EntityManagerGetRepositoryDynamicReturnTypeExtension.php index 2c7a4835..8d830b23 100644 --- a/src/Type/Doctrine/EntityManagerGetRepositoryDynamicReturnTypeExtension.php +++ b/src/Type/Doctrine/EntityManagerGetRepositoryDynamicReturnTypeExtension.php @@ -50,9 +50,7 @@ public function getTypeFromMethodCall( $methodReflection->getVariants() )->getReturnType(); } - $argType = $scope->getType($methodCall->args[0]->value); - if (!$argType instanceof ConstantStringType) { return new MixedType(); } From 11dba249802f6cdedb88bc4c1e6485a301565d75 Mon Sep 17 00:00:00 2001 From: Alexander Schranz Date: Tue, 23 Oct 2018 20:58:42 +0200 Subject: [PATCH 6/7] check that repositoryClass is string before calling class_exists --- .../EntityManagerGetRepositoryDynamicReturnTypeExtension.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Type/Doctrine/EntityManagerGetRepositoryDynamicReturnTypeExtension.php b/src/Type/Doctrine/EntityManagerGetRepositoryDynamicReturnTypeExtension.php index 8d830b23..4769cdef 100644 --- a/src/Type/Doctrine/EntityManagerGetRepositoryDynamicReturnTypeExtension.php +++ b/src/Type/Doctrine/EntityManagerGetRepositoryDynamicReturnTypeExtension.php @@ -57,7 +57,7 @@ public function getTypeFromMethodCall( $repositoryClass = preg_replace($this->repositoryPattern, $this->repositoryReplace, $argType->getValue()); - if (!$repositoryClass || !class_exists($repositoryClass)) { + if (!is_string($repositoryClass) || !class_exists($repositoryClass)) { $repositoryClass = $this->repositoryClass; } From d365d3f8432659bda5edd884867a71f1b9ab9abe Mon Sep 17 00:00:00 2001 From: Alexander Schranz Date: Tue, 23 Oct 2018 21:02:01 +0200 Subject: [PATCH 7/7] throw exception is repositoryClass replace doesn't work --- ...anagerGetRepositoryDynamicReturnTypeExtension.php | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/Type/Doctrine/EntityManagerGetRepositoryDynamicReturnTypeExtension.php b/src/Type/Doctrine/EntityManagerGetRepositoryDynamicReturnTypeExtension.php index 4769cdef..3f95379e 100644 --- a/src/Type/Doctrine/EntityManagerGetRepositoryDynamicReturnTypeExtension.php +++ b/src/Type/Doctrine/EntityManagerGetRepositoryDynamicReturnTypeExtension.php @@ -57,7 +57,17 @@ public function getTypeFromMethodCall( $repositoryClass = preg_replace($this->repositoryPattern, $this->repositoryReplace, $argType->getValue()); - if (!is_string($repositoryClass) || !class_exists($repositoryClass)) { + if (!is_string($repositoryClass)) { + throw new \InvalidArgumentException( + sprintf( + 'Given repositoryPattern("%s") or repositoryReplace("%s") is invalid.', + $this->repositoryPattern, + $this->repositoryReplace + ) + ); + } + + if (!class_exists($repositoryClass)) { $repositoryClass = $this->repositoryClass; }