22
33namespace PHPStan \Type \Doctrine ;
44
5+ use Doctrine \ORM \Mapping \ClassMetadataInfo ;
56use Doctrine \Persistence \ObjectManager ;
67use PHPStan \Reflection \ReflectionProvider ;
78use function is_file ;
@@ -58,6 +59,56 @@ public function getObjectManager(): ?ObjectManager
5859 return $ this ->objectManager ;
5960 }
6061
62+ /**
63+ * @param class-string $className
64+ * @return bool
65+ */
66+ public function isTransient (string $ className ): bool
67+ {
68+ $ objectManager = $ this ->getObjectManager ();
69+ if ($ objectManager === null ) {
70+ return true ;
71+ }
72+
73+ try {
74+ return $ objectManager ->getMetadataFactory ()->isTransient ($ className );
75+ } catch (\ReflectionException $ e ) {
76+ return true ;
77+ }
78+ }
79+
80+ /**
81+ * @template T of object
82+ * @param class-string<T> $className
83+ * @return ClassMetadataInfo<T>|null
84+ */
85+ public function getClassMetadata (string $ className ): ?ClassMetadataInfo
86+ {
87+ $ objectManager = $ this ->getObjectManager ();
88+ if ($ objectManager === null ) {
89+ return null ;
90+ }
91+
92+ if ($ this ->isTransient ($ className )) {
93+ return null ;
94+ }
95+
96+ try {
97+ $ metadata = $ objectManager ->getClassMetadata ($ className );
98+ } catch (\Doctrine \ORM \Mapping \MappingException $ e ) {
99+ return null ;
100+ }
101+
102+ if (!$ metadata instanceof ClassMetadataInfo) {
103+ return null ;
104+ }
105+
106+ /** @var \Doctrine\ORM\Mapping\ClassMetadataInfo<T> $ormMetadata */
107+ $ ormMetadata = $ metadata ;
108+
109+ return $ ormMetadata ;
110+ }
111+
61112 private function loadObjectManager (string $ objectManagerLoader ): ?ObjectManager
62113 {
63114 if (!is_file ($ objectManagerLoader )) {
@@ -97,11 +148,6 @@ public function getResolvedRepositoryClass(): string
97148
98149 public function getRepositoryClass (string $ className ): string
99150 {
100- $ objectManager = $ this ->getObjectManager ();
101- if ($ objectManager === null ) {
102- return $ this ->getResolvedRepositoryClass ();
103- }
104-
105151 if (!$ this ->reflectionProvider ->hasClass ($ className )) {
106152 return $ this ->getResolvedRepositoryClass ();
107153 }
@@ -111,15 +157,17 @@ public function getRepositoryClass(string $className): string
111157 return $ this ->getResolvedRepositoryClass ();
112158 }
113159
114- $ metadata = $ objectManager ->getClassMetadata ($ classReflection ->getName ());
160+ $ metadata = $ this ->getClassMetadata ($ classReflection ->getName ());
161+ if ($ metadata !== null ) {
162+ return $ metadata ->customRepositoryClassName ?? $ this ->getResolvedRepositoryClass ();
163+ }
115164
116- $ ormMetadataClass = 'Doctrine\ORM\Mapping\ClassMetadata ' ;
117- if ($ metadata instanceof $ ormMetadataClass ) {
118- /** @var \Doctrine\ORM\Mapping\ClassMetadata<object> $ormMetadata */
119- $ ormMetadata = $ metadata ;
120- return $ ormMetadata ->customRepositoryClassName ?? $ this ->getResolvedRepositoryClass ();
165+ $ objectManager = $ this ->getObjectManager ();
166+ if ($ objectManager === null ) {
167+ return $ this ->getResolvedRepositoryClass ();
121168 }
122169
170+ $ metadata = $ objectManager ->getClassMetadata ($ classReflection ->getName ());
123171 $ odmMetadataClass = 'Doctrine\ODM\MongoDB\Mapping\ClassMetadata ' ;
124172 if ($ metadata instanceof $ odmMetadataClass ) {
125173 /** @var \Doctrine\ODM\MongoDB\Mapping\ClassMetadata<object> $odmMetadata */
0 commit comments