Skip to content

Commit 116392a

Browse files
committed
Made ObjectMetadataResolver lazier
1 parent 8501f42 commit 116392a

File tree

1 file changed

+52
-21
lines changed

1 file changed

+52
-21
lines changed

src/Type/Doctrine/ObjectMetadataResolver.php

Lines changed: 52 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -9,24 +9,43 @@
99
final class ObjectMetadataResolver
1010
{
1111

12-
/** @var ?ObjectManager */
12+
/** @var string|null */
13+
private $objectManagerLoader;
14+
15+
/** @var ObjectManager|null|false */
1316
private $objectManager;
1417

15-
/** @var string */
18+
/** @var string|null */
1619
private $repositoryClass;
1720

21+
/** @var string|null */
22+
private $resolvedRepositoryClass;
23+
1824
public function __construct(?string $objectManagerLoader, ?string $repositoryClass)
1925
{
20-
if ($objectManagerLoader !== null) {
21-
$this->objectManager = $this->loadObjectManager($objectManagerLoader);
26+
$this->objectManagerLoader = $objectManagerLoader;
27+
$this->repositoryClass = $repositoryClass;
28+
}
29+
30+
public function getObjectManager(): ?ObjectManager
31+
{
32+
if ($this->objectManager === false) {
33+
return null;
2234
}
23-
if ($repositoryClass !== null) {
24-
$this->repositoryClass = $repositoryClass;
25-
} elseif ($this->objectManager !== null && get_class($this->objectManager) === 'Doctrine\ODM\MongoDB\DocumentManager') {
26-
$this->repositoryClass = 'Doctrine\ODM\MongoDB\DocumentRepository';
27-
} else {
28-
$this->repositoryClass = 'Doctrine\ORM\EntityRepository';
35+
36+
if ($this->objectManager !== null) {
37+
return $this->objectManager;
2938
}
39+
40+
if ($this->objectManagerLoader === null) {
41+
$this->objectManager = false;
42+
43+
return null;
44+
}
45+
46+
$this->objectManager = $this->loadObjectManager($this->objectManagerLoader);
47+
48+
return $this->objectManager;
3049
}
3150

3251
private function loadObjectManager(string $objectManagerLoader): ?ObjectManager
@@ -41,34 +60,46 @@ private function loadObjectManager(string $objectManagerLoader): ?ObjectManager
4160
return require $objectManagerLoader;
4261
}
4362

63+
private function getResolvedRepositoryClass(): string
64+
{
65+
if ($this->resolvedRepositoryClass !== null) {
66+
return $this->resolvedRepositoryClass;
67+
}
68+
69+
$objectManager = $this->getObjectManager();
70+
if ($this->repositoryClass !== null) {
71+
return $this->resolvedRepositoryClass = $this->repositoryClass;
72+
} elseif ($objectManager !== null && get_class($objectManager) === 'Doctrine\ODM\MongoDB\DocumentManager') {
73+
return $this->resolvedRepositoryClass = 'Doctrine\ODM\MongoDB\DocumentRepository';
74+
}
75+
76+
return $this->resolvedRepositoryClass = 'Doctrine\ORM\EntityRepository';
77+
}
78+
4479
public function getRepositoryClass(string $className): string
4580
{
46-
if ($this->objectManager === null) {
47-
return $this->repositoryClass;
81+
$objectManager = $this->getObjectManager();
82+
if ($objectManager === null) {
83+
return $this->getResolvedRepositoryClass();
4884
}
4985

50-
$metadata = $this->objectManager->getClassMetadata($className);
86+
$metadata = $objectManager->getClassMetadata($className);
5187

5288
$ormMetadataClass = 'Doctrine\ORM\Mapping\ClassMetadata';
5389
if ($metadata instanceof $ormMetadataClass) {
5490
/** @var \Doctrine\ORM\Mapping\ClassMetadata $ormMetadata */
5591
$ormMetadata = $metadata;
56-
return $ormMetadata->customRepositoryClassName ?? $this->repositoryClass;
92+
return $ormMetadata->customRepositoryClassName ?? $this->getResolvedRepositoryClass();
5793
}
5894

5995
$odmMetadataClass = 'Doctrine\ODM\MongoDB\Mapping\ClassMetadata';
6096
if ($metadata instanceof $odmMetadataClass) {
6197
/** @var \Doctrine\ODM\MongoDB\Mapping\ClassMetadata $odmMetadata */
6298
$odmMetadata = $metadata;
63-
return $odmMetadata->customRepositoryClassName ?? $this->repositoryClass;
99+
return $odmMetadata->customRepositoryClassName ?? $this->getResolvedRepositoryClass();
64100
}
65101

66-
return $this->repositoryClass;
67-
}
68-
69-
public function getObjectManager(): ?ObjectManager
70-
{
71-
return $this->objectManager;
102+
return $this->getResolvedRepositoryClass();
72103
}
73104

74105
}

0 commit comments

Comments
 (0)