summaryrefslogtreecommitdiff
path: root/vendor/doctrine/persistence/src/Persistence/Mapping/Driver/MappingDriverChain.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/doctrine/persistence/src/Persistence/Mapping/Driver/MappingDriverChain.php')
-rw-r--r--vendor/doctrine/persistence/src/Persistence/Mapping/Driver/MappingDriverChain.php142
1 files changed, 142 insertions, 0 deletions
diff --git a/vendor/doctrine/persistence/src/Persistence/Mapping/Driver/MappingDriverChain.php b/vendor/doctrine/persistence/src/Persistence/Mapping/Driver/MappingDriverChain.php
new file mode 100644
index 0000000..8563dd2
--- /dev/null
+++ b/vendor/doctrine/persistence/src/Persistence/Mapping/Driver/MappingDriverChain.php
@@ -0,0 +1,142 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Doctrine\Persistence\Mapping\Driver;
6
7use Doctrine\Persistence\Mapping\ClassMetadata;
8use Doctrine\Persistence\Mapping\MappingException;
9
10use function array_keys;
11use function spl_object_hash;
12use function strpos;
13
14/**
15 * The DriverChain allows you to add multiple other mapping drivers for
16 * certain namespaces.
17 */
18class MappingDriverChain implements MappingDriver
19{
20 /**
21 * The default driver.
22 *
23 * @var MappingDriver|null
24 */
25 private $defaultDriver;
26
27 /** @var array<string, MappingDriver> */
28 private $drivers = [];
29
30 /**
31 * Gets the default driver.
32 *
33 * @return MappingDriver|null
34 */
35 public function getDefaultDriver()
36 {
37 return $this->defaultDriver;
38 }
39
40 /**
41 * Set the default driver.
42 *
43 * @return void
44 */
45 public function setDefaultDriver(MappingDriver $driver)
46 {
47 $this->defaultDriver = $driver;
48 }
49
50 /**
51 * Adds a nested driver.
52 *
53 * @return void
54 */
55 public function addDriver(MappingDriver $nestedDriver, string $namespace)
56 {
57 $this->drivers[$namespace] = $nestedDriver;
58 }
59
60 /**
61 * Gets the array of nested drivers.
62 *
63 * @return array<string, MappingDriver> $drivers
64 */
65 public function getDrivers()
66 {
67 return $this->drivers;
68 }
69
70 /**
71 * {@inheritDoc}
72 */
73 public function loadMetadataForClass(string $className, ClassMetadata $metadata)
74 {
75 foreach ($this->drivers as $namespace => $driver) {
76 if (strpos($className, $namespace) === 0) {
77 $driver->loadMetadataForClass($className, $metadata);
78
79 return;
80 }
81 }
82
83 if ($this->defaultDriver !== null) {
84 $this->defaultDriver->loadMetadataForClass($className, $metadata);
85
86 return;
87 }
88
89 throw MappingException::classNotFoundInNamespaces($className, array_keys($this->drivers));
90 }
91
92 /**
93 * {@inheritDoc}
94 */
95 public function getAllClassNames()
96 {
97 $classNames = [];
98 $driverClasses = [];
99
100 foreach ($this->drivers as $namespace => $driver) {
101 $oid = spl_object_hash($driver);
102
103 if (! isset($driverClasses[$oid])) {
104 $driverClasses[$oid] = $driver->getAllClassNames();
105 }
106
107 foreach ($driverClasses[$oid] as $className) {
108 if (strpos($className, $namespace) !== 0) {
109 continue;
110 }
111
112 $classNames[$className] = true;
113 }
114 }
115
116 if ($this->defaultDriver !== null) {
117 foreach ($this->defaultDriver->getAllClassNames() as $className) {
118 $classNames[$className] = true;
119 }
120 }
121
122 return array_keys($classNames);
123 }
124
125 /**
126 * {@inheritDoc}
127 */
128 public function isTransient(string $className)
129 {
130 foreach ($this->drivers as $namespace => $driver) {
131 if (strpos($className, $namespace) === 0) {
132 return $driver->isTransient($className);
133 }
134 }
135
136 if ($this->defaultDriver !== null) {
137 return $this->defaultDriver->isTransient($className);
138 }
139
140 return true;
141 }
142}