diff --git a/extension.neon b/extension.neon index 21e8e248..2ae98597 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 - diff --git a/src/Type/Doctrine/EntityManagerGetRepositoryDynamicReturnTypeExtension.php b/src/Type/Doctrine/EntityManagerGetRepositoryDynamicReturnTypeExtension.php index b383c18f..3f95379e 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 @@ -47,7 +55,23 @@ public function getTypeFromMethodCall( return new MixedType(); } - return new EntityRepositoryType($argType->getValue(), $this->repositoryClass); + $repositoryClass = preg_replace($this->repositoryPattern, $this->repositoryReplace, $argType->getValue()); + + 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; + } + + return new EntityRepositoryType($argType->getValue(), $repositoryClass); } }