From c1b968fc8d1ea9a53b1b07f931c729e222f18422 Mon Sep 17 00:00:00 2001 From: Mikael Peigney Date: Thu, 14 May 2020 16:24:28 +0200 Subject: [PATCH] WIP: Handle multiple Doctrine managers --- ...tityRepositoryClassReflectionExtension.php | 2 +- src/Rules/Doctrine/ORM/EntityColumnRule.php | 6 +++-- src/Rules/Doctrine/ORM/EntityRelationRule.php | 5 ++-- .../Doctrine/ORM/RepositoryMethodCallRule.php | 2 +- src/Type/Doctrine/ObjectMetadataResolver.php | 26 +++++++++++++++---- 5 files changed, 30 insertions(+), 11 deletions(-) mode change 100644 => 100755 src/Reflection/Doctrine/EntityRepositoryClassReflectionExtension.php mode change 100644 => 100755 src/Rules/Doctrine/ORM/EntityColumnRule.php mode change 100644 => 100755 src/Rules/Doctrine/ORM/EntityRelationRule.php mode change 100644 => 100755 src/Rules/Doctrine/ORM/RepositoryMethodCallRule.php mode change 100644 => 100755 src/Type/Doctrine/ObjectMetadataResolver.php diff --git a/src/Reflection/Doctrine/EntityRepositoryClassReflectionExtension.php b/src/Reflection/Doctrine/EntityRepositoryClassReflectionExtension.php old mode 100644 new mode 100755 index 3773ddfa..bfb753d5 --- a/src/Reflection/Doctrine/EntityRepositoryClassReflectionExtension.php +++ b/src/Reflection/Doctrine/EntityRepositoryClassReflectionExtension.php @@ -60,7 +60,7 @@ public function hasMethod(\PHPStan\Reflection\ClassReflection $classReflection, return false; } - $objectManager = $this->objectMetadataResolver->getObjectManager(); + $objectManager = $this->objectMetadataResolver->getObjectManagerForClass($entityClassType->getClassName()); if ($objectManager === null) { return false; } diff --git a/src/Rules/Doctrine/ORM/EntityColumnRule.php b/src/Rules/Doctrine/ORM/EntityColumnRule.php old mode 100644 new mode 100755 index 57c4bf46..1d1a0b29 --- a/src/Rules/Doctrine/ORM/EntityColumnRule.php +++ b/src/Rules/Doctrine/ORM/EntityColumnRule.php @@ -2,6 +2,7 @@ namespace PHPStan\Rules\Doctrine\ORM; +use Doctrine\Persistence\AbstractManagerRegistry; use PhpParser\Node; use PHPStan\Analyser\Scope; use PHPStan\Reflection\MissingPropertyFromReflectionException; @@ -58,12 +59,13 @@ public function processNode(Node $node, Scope $scope): array return []; } - $objectManager = $this->objectMetadataResolver->getObjectManager(); + $className = $class->getName(); + + $objectManager = $this->objectMetadataResolver->getObjectManagerForClass($className); if ($objectManager === null) { return []; } - $className = $class->getName(); if ($objectManager->getMetadataFactory()->isTransient($className)) { return []; } diff --git a/src/Rules/Doctrine/ORM/EntityRelationRule.php b/src/Rules/Doctrine/ORM/EntityRelationRule.php old mode 100644 new mode 100755 index 67dcfc3c..8bb87bcc --- a/src/Rules/Doctrine/ORM/EntityRelationRule.php +++ b/src/Rules/Doctrine/ORM/EntityRelationRule.php @@ -42,12 +42,13 @@ public function processNode(Node $node, Scope $scope): array return []; } - $objectManager = $this->objectMetadataResolver->getObjectManager(); + $className = $class->getName(); + + $objectManager = $this->objectMetadataResolver->getObjectManagerForClass($className); if ($objectManager === null) { return []; } - $className = $class->getName(); if ($objectManager->getMetadataFactory()->isTransient($className)) { return []; } diff --git a/src/Rules/Doctrine/ORM/RepositoryMethodCallRule.php b/src/Rules/Doctrine/ORM/RepositoryMethodCallRule.php old mode 100644 new mode 100755 index b79b0d5c..f4a8b437 --- a/src/Rules/Doctrine/ORM/RepositoryMethodCallRule.php +++ b/src/Rules/Doctrine/ORM/RepositoryMethodCallRule.php @@ -74,7 +74,7 @@ public function processNode(Node $node, Scope $scope): array return []; } - $objectManager = $this->objectMetadataResolver->getObjectManager(); + $objectManager = $this->objectMetadataResolver->getObjectManagerForClass($entityClass); if ($objectManager === null) { return []; } diff --git a/src/Type/Doctrine/ObjectMetadataResolver.php b/src/Type/Doctrine/ObjectMetadataResolver.php old mode 100644 new mode 100755 index f32875ca..0c551bf0 --- a/src/Type/Doctrine/ObjectMetadataResolver.php +++ b/src/Type/Doctrine/ObjectMetadataResolver.php @@ -2,7 +2,8 @@ namespace PHPStan\Type\Doctrine; -use Doctrine\Common\Persistence\ObjectManager; +use Doctrine\Persistence\ObjectManager; +use Doctrine\Persistence\AbstractManagerRegistry; use PHPStan\Reflection\ReflectionProvider; use function file_exists; use function is_readable; @@ -16,7 +17,7 @@ final class ObjectMetadataResolver /** @var string|null */ private $objectManagerLoader; - /** @var ObjectManager|null|false */ + /** @var ObjectManager|AbstractManagerRegistry|null|false */ private $objectManager; /** @var string|null */ @@ -36,7 +37,7 @@ public function __construct( $this->repositoryClass = $repositoryClass; } - public function getObjectManager(): ?ObjectManager + public function getObjectManager() { if ($this->objectManager === false) { return null; @@ -56,8 +57,19 @@ public function getObjectManager(): ?ObjectManager return $this->objectManager; } + public function getObjectManagerForClass(string $className): ?ObjectManager + { + if ($this->objectManager instanceof ObjectManager) { + return $this->objectManager; + } + if ($this->objectManager instanceof AbstractManagerRegistry) { + return $this->objectManager->getManagerForClass($className); + } - private function loadObjectManager(string $objectManagerLoader): ?ObjectManager + return null; + } + + private function loadObjectManager(string $objectManagerLoader) { if ( !file_exists($objectManagerLoader) @@ -76,6 +88,10 @@ private function getResolvedRepositoryClass(): string } $objectManager = $this->getObjectManager(); + if($objectManager instanceof AbstractManagerRegistry) { + // Use default manager, which is enough to determine whether we're in an ODM or ORM environment + $objectManager = $objectManager->getManager(); + } if ($this->repositoryClass !== null) { return $this->resolvedRepositoryClass = $this->repositoryClass; } elseif ($objectManager !== null && get_class($objectManager) === 'Doctrine\ODM\MongoDB\DocumentManager') { @@ -87,7 +103,7 @@ private function getResolvedRepositoryClass(): string public function getRepositoryClass(string $className): string { - $objectManager = $this->getObjectManager(); + $objectManager = $this->getObjectManagerForClass($className); if ($objectManager === null) { return $this->getResolvedRepositoryClass(); }