2
2
3
3
namespace PHPStan \Type \Doctrine ;
4
4
5
+ use Doctrine \ORM \Mapping \ClassMetadataInfo ;
5
6
use Doctrine \Persistence \ObjectManager ;
6
7
use PHPStan \Reflection \ReflectionProvider ;
7
8
use function is_file ;
@@ -58,6 +59,56 @@ public function getObjectManager(): ?ObjectManager
58
59
return $ this ->objectManager ;
59
60
}
60
61
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
+
61
112
private function loadObjectManager (string $ objectManagerLoader ): ?ObjectManager
62
113
{
63
114
if (!is_file ($ objectManagerLoader )) {
@@ -97,11 +148,6 @@ public function getResolvedRepositoryClass(): string
97
148
98
149
public function getRepositoryClass (string $ className ): string
99
150
{
100
- $ objectManager = $ this ->getObjectManager ();
101
- if ($ objectManager === null ) {
102
- return $ this ->getResolvedRepositoryClass ();
103
- }
104
-
105
151
if (!$ this ->reflectionProvider ->hasClass ($ className )) {
106
152
return $ this ->getResolvedRepositoryClass ();
107
153
}
@@ -111,15 +157,17 @@ public function getRepositoryClass(string $className): string
111
157
return $ this ->getResolvedRepositoryClass ();
112
158
}
113
159
114
- $ metadata = $ objectManager ->getClassMetadata ($ classReflection ->getName ());
160
+ $ metadata = $ this ->getClassMetadata ($ classReflection ->getName ());
161
+ if ($ metadata !== null ) {
162
+ return $ metadata ->customRepositoryClassName ?? $ this ->getResolvedRepositoryClass ();
163
+ }
115
164
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 ();
121
168
}
122
169
170
+ $ metadata = $ objectManager ->getClassMetadata ($ classReflection ->getName ());
123
171
$ odmMetadataClass = 'Doctrine\ODM\MongoDB\Mapping\ClassMetadata ' ;
124
172
if ($ metadata instanceof $ odmMetadataClass ) {
125
173
/** @var \Doctrine\ODM\MongoDB\Mapping\ClassMetadata<object> $odmMetadata */
0 commit comments