PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / 5.36.0
MailPoet – Newsletters, Email Marketing, and Automation v5.36.0
5.36.0 5.35.1 5.35.0 5.34.3 5.34.2 5.34.1 5.34.0 5.33.1 5.33.0 5.32.0 5.31.0 5.30.0 5.29.0 5.28.1 5.28.0 5.27.0 5.26.0 5.26.1 5.25.0 5.24.0 4.43.0 4.43.1 4.44.0 4.44.1 4.45.0 4.46.0 4.47.0 4.48.0 4.48.1 4.48.2 4.49.0 4.49.1 4.5.0 4.5.1 4.5.2 4.50.0 4.50.1 4.51.0 4.51.1 4.51.2 4.52.0 4.53.0 4.54.0 4.55.0 4.56.0 4.57.0 4.58.0 4.58.1 4.58.2 4.6.0 4.6.1 4.6.2 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 5.0.0 5.0.1 5.0.2 5.1.0 5.1.1 5.10.0 5.10.1 5.11.0 5.12.0 5.12.1 5.12.10 5.12.11 5.12.12 5.12.13 5.12.2 5.12.3 5.12.4 5.12.5 5.12.6 5.12.7 5.12.8 5.12.9 5.13.0 5.13.1 5.13.2 5.14.0 5.14.1 5.14.2 5.14.3 5.15.0 5.15.1 5.16.0 5.16.1 5.16.2 5.16.3 5.16.4 5.17.0 5.17.1 5.17.2 5.17.3 5.17.4 5.17.5 5.17.6 5.18.0 5.19.0 5.2.0 5.2.1 5.2.2 5.2.3 5.20.0 5.21.0 5.21.1 5.21.2 5.21.3 5.22.0 5.22.1 5.22.2 5.22.3 5.22.4 5.23.0 5.23.1 5.23.2 5.3.0 5.3.1 5.3.2 5.3.3 5.3.4 5.3.5 5.3.6 5.3.7 5.4.0 5.4.1 5.4.2 5.5.0 5.5.1 5.5.2 5.6.0 5.6.1 5.6.2 5.6.3 5.6.4 5.7.0 5.7.1 5.8.0 5.8.1 5.9.0 3.0.0-beta.15 3.7.1 3.0.0-beta.16 3.7.2 3.0.0-beta.17 3.7.3 3.0.0-beta.18 3.7.4 3.0.0-beta.19 3.7.5 3.0.0-beta.2 3.7.6 3.0.0-beta.20 3.7.8 3.0.0-beta.21 3.70.0 3.0.0-beta.22 3.71.0 3.0.0-beta.23 3.71.1 3.0.0-beta.23.1 3.71.2 3.0.0-beta.23.2 3.71.3 3.0.0-beta.24 3.72.0 3.0.0-beta.25 3.73.0 3.0.0-beta.26 3.73.1 3.0.0-beta.27 3.73.2 3.0.0-beta.28 3.74.0 3.0.0-beta.29 3.74.1 3.0.0-beta.3 3.74.2 3.0.0-beta.30 3.74.3 3.0.0-beta.31 3.75.0 3.0.0-beta.32 3.75.1 3.0.0-beta.33 3.76.0 3.0.0-beta.33.1 3.77.0 3.0.0-beta.34.0.0 3.77.1 3.0.0-beta.36.0.0 3.78.0 3.0.0-beta.36.0.1 3.79.0 3.0.0-beta.36.2.0 3.8 3.0.0-beta.36.3.0 3.8.1 3.0.0-beta.36.3.1 3.8.2 3.0.0-beta.37.0.0 3.8.3 3.0.0-beta.4 3.8.4 3.0.0-beta.5 3.8.5 3.0.0-beta.6 3.8.6 3.0.0-beta.7 3.80.0 3.0.0-beta.7.1 3.81.0 3.0.0-beta.8 3.82.0 3.0.0-beta.9 3.83.0 3.0.0-rc.1.0.0 3.84.0 3.0.0-rc.1.0.1 3.84.1 3.0.0-rc.1.0.2 3.85.0 3.0.0-rc.1.0.3 3.85.1 3.0.0-rc.1.0.4 3.86.0 3.0.0-rc.2.0.0 3.87.0 3.0.0-rc.2.0.1 3.87.1 3.0.0-rc.2.0.2 3.87.2 3.0.0-rc.2.0.3 3.88.0 3.0.1 3.88.1 3.0.2 3.88.2 3.0.3 3.89.0 3.0.4 3.89.1 3.0.5 3.89.2 3.0.6 3.89.3 3.0.7 3.89.4 3.0.8 3.9.0 3.0.9 3.9.1 3.1.0 3.90.0 3.10 3.90.1 3.10.1 3.90.2 3.100.0 3.91.0 3.100.1 3.91.1 3.100.2 3.92.0 3.101.0 3.92.1 3.101.1 3.93.0 3.102.0 3.93.1 3.102.1 3.94.0 3.103.0 3.95.0 3.103.1 3.95.1 3.11.0 3.96.0 3.11.1 3.96.1 3.11.2 3.97.0 3.11.3 3.98.0 3.11.4 3.98.1 3.11.5 3.99.0 3.12.0 3.99.1 3.12.1 4.0.0 3.13.0 4.0.1 3.14.0 4.1.0 3.14.1 4.1.1 3.15.0 4.10.0 3.16.0 4.11.0 3.16.1 4.11.1 3.16.2 4.12.0 3.16.3 4.12.1 3.17.0 4.12.2 3.17.1 4.13.0 3.17.2 4.14.0 3.18.0 4.15.0 3.18.1 4.16.0 3.18.2 4.17.0 3.19.0 4.17.1 3.19.1 4.18.0 3.19.2 4.18.1 3.19.3 4.19.0 3.2.0 4.2.0 3.2.1 4.20.0 3.2.2 4.20.1 3.2.3 4.20.2 3.2.4 4.21.0 3.2.5 4.22.0 3.20.0 4.22.1 3.21.0 4.22.2 3.21.1 4.23.0 3.22.0 4.24.0 3.23.0 4.25.0 3.23.1 4.26.0 3.23.2 4.26.1 3.24.0 4.27.0 3.25.0 4.28.0 3.25.1 4.29.0 3.26.0 4.3.0 3.26.1 4.3.1 3.27.0 4.30.0 3.28.0 4.31.0 3.29.0 4.31.1 3.3.0 4.32.0 3.3.1 4.33.0 3.3.2 4.34.0 3.3.3 4.35.0 3.3.4 4.35.1 3.3.5 4.36.0 3.3.6 4.37.0 3.30.0 4.38.0 3.31.0 4.39.0 3.31.1 4.4.0 3.32.0 4.40.0 3.32.1 4.41.0 3.32.2 4.41.1 3.33.0 4.41.2 3.34.0 4.41.3 3.34.1 4.42.0 3.34.2 4.42.1 3.34.3 3.34.4 3.35.0 3.35.1 3.35.3 3.35.4 3.36.0 3.37.0 3.37.1 3.37.2 3.37.3 3.38.0 3.38.1 3.39.0 3.39.1 3.39.2 3.4.0 3.4.1 3.4.2 3.4.3 3.4.4 3.40.0 3.40.1 3.41.0 3.41.1 3.41.2 3.42.0 3.42.1 3.42.2 3.42.3 3.43.0 3.43.1 3.44.0 3.45.0 3.45.1 3.46.0 3.46.1 3.46.10 3.46.11 3.46.12 3.46.13 3.46.14 3.46.2 3.46.3 3.46.4 3.46.5 3.46.6 3.46.7 3.46.8 3.46.9 3.47.0 3.47.1 3.47.10 3.47.11 3.47.2 3.47.3 3.47.5 3.47.6 3.47.7 3.47.9 3.48.0 3.48.1 3.49.0 3.49.1 3.5.0 3.5.1 3.50.0 3.51.0 3.51.1 3.51.2 3.52.0 3.53.0 3.54.0 3.54.1 3.54.2 3.54.3 3.55.0 3.55.1 3.56.0 3.56.1 3.56.2 3.57.0 3.57.1 3.58.0 3.59.0 3.59.1 3.59.2 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.6.5 3.6.6 3.6.7 3.60.0 3.60.1 3.60.10 3.60.11 3.60.12 3.60.2 3.60.3 3.60.4 3.60.6 3.60.7 3.60.8 3.60.9 3.61.0 3.62.0 3.62.1 3.63.0 3.64.0 3.64.1 3.64.2 3.64.3 3.65.0 trunk 3.65.1 3.0.0 3.66.0 3.0.0-beta.1 3.67.0 3.0.0-beta.10 3.67.1 3.0.0-beta.11 3.68.0 3.0.0-beta.12 3.69.0 3.0.0-beta.13 3.69.1 3.0.0-beta.14 3.7.0
mailpoet / vendor-prefixed / doctrine / persistence / src / Persistence / Mapping / AbstractClassMetadataFactory.php
mailpoet / vendor-prefixed / doctrine / persistence / src / Persistence / Mapping Last commit date
Driver 9 months ago AbstractClassMetadataFactory.php 8 months ago ClassMetadata.php 9 months ago ClassMetadataFactory.php 9 months ago MappingException.php 9 months ago ProxyClassNameResolver.php 9 months ago ReflectionService.php 9 months ago RuntimeReflectionService.php 9 months ago StaticReflectionService.php 9 months ago index.php 3 years ago
AbstractClassMetadataFactory.php
232 lines
1 <?php
2 declare (strict_types=1);
3 namespace MailPoetVendor\Doctrine\Persistence\Mapping;
4 if (!defined('ABSPATH')) exit;
5 use MailPoetVendor\Doctrine\Persistence\Mapping\Driver\MappingDriver;
6 use MailPoetVendor\Doctrine\Persistence\Proxy;
7 use MailPoetVendor\Psr\Cache\CacheItemPoolInterface;
8 use ReflectionClass;
9 use ReflectionException;
10 use function array_combine;
11 use function array_keys;
12 use function array_map;
13 use function array_reverse;
14 use function array_unshift;
15 use function assert;
16 use function class_exists;
17 use function ltrim;
18 use function str_replace;
19 use function strpos;
20 use function strrpos;
21 use function substr;
22 abstract class AbstractClassMetadataFactory implements ClassMetadataFactory
23 {
24 protected $cacheSalt = '__CLASSMETADATA__';
25 private $cache;
26 private $loadedMetadata = [];
27 protected $initialized = \false;
28 private $reflectionService = null;
29 private $proxyClassNameResolver = null;
30 public function setCache(CacheItemPoolInterface $cache) : void
31 {
32 $this->cache = $cache;
33 }
34 protected final function getCache() : ?CacheItemPoolInterface
35 {
36 return $this->cache;
37 }
38 public function getLoadedMetadata()
39 {
40 return $this->loadedMetadata;
41 }
42 public function getAllMetadata()
43 {
44 if (!$this->initialized) {
45 $this->initialize();
46 }
47 $driver = $this->getDriver();
48 $metadata = [];
49 foreach ($driver->getAllClassNames() as $className) {
50 $metadata[] = $this->getMetadataFor($className);
51 }
52 return $metadata;
53 }
54 public function setProxyClassNameResolver(ProxyClassNameResolver $resolver) : void
55 {
56 $this->proxyClassNameResolver = $resolver;
57 }
58 protected abstract function initialize();
59 protected abstract function getDriver();
60 protected abstract function wakeupReflection(ClassMetadata $class, ReflectionService $reflService);
61 protected abstract function initializeReflection(ClassMetadata $class, ReflectionService $reflService);
62 protected abstract function isEntity(ClassMetadata $class);
63 private function normalizeClassName(string $className) : string
64 {
65 return ltrim($className, '\\');
66 }
67 public function getMetadataFor(string $className)
68 {
69 $className = $this->normalizeClassName($className);
70 if (isset($this->loadedMetadata[$className])) {
71 return $this->loadedMetadata[$className];
72 }
73 if (class_exists($className, \false) && (new ReflectionClass($className))->isAnonymous()) {
74 throw MappingException::classIsAnonymous($className);
75 }
76 if (!class_exists($className, \false) && strpos($className, ':') !== \false) {
77 throw MappingException::nonExistingClass($className);
78 }
79 $realClassName = $this->getRealClass($className);
80 if (isset($this->loadedMetadata[$realClassName])) {
81 // We do not have the alias name in the map, include it
82 return $this->loadedMetadata[$className] = $this->loadedMetadata[$realClassName];
83 }
84 try {
85 if ($this->cache !== null) {
86 $cached = $this->cache->getItem($this->getCacheKey($realClassName))->get();
87 if ($cached instanceof ClassMetadata) {
88 $this->loadedMetadata[$realClassName] = $cached;
89 $this->wakeupReflection($cached, $this->getReflectionService());
90 } else {
91 $loadedMetadata = $this->loadMetadata($realClassName);
92 $classNames = array_combine(array_map([$this, 'getCacheKey'], $loadedMetadata), $loadedMetadata);
93 foreach ($this->cache->getItems(array_keys($classNames)) as $item) {
94 if (!isset($classNames[$item->getKey()])) {
95 continue;
96 }
97 $item->set($this->loadedMetadata[$classNames[$item->getKey()]]);
98 $this->cache->saveDeferred($item);
99 }
100 $this->cache->commit();
101 }
102 } else {
103 $this->loadMetadata($realClassName);
104 }
105 } catch (MappingException $loadingException) {
106 $fallbackMetadataResponse = $this->onNotFoundMetadata($realClassName);
107 if ($fallbackMetadataResponse === null) {
108 throw $loadingException;
109 }
110 $this->loadedMetadata[$realClassName] = $fallbackMetadataResponse;
111 }
112 if ($className !== $realClassName) {
113 // We do not have the alias name in the map, include it
114 $this->loadedMetadata[$className] = $this->loadedMetadata[$realClassName];
115 }
116 return $this->loadedMetadata[$className];
117 }
118 public function hasMetadataFor(string $className)
119 {
120 $className = $this->normalizeClassName($className);
121 return isset($this->loadedMetadata[$className]);
122 }
123 public function setMetadataFor(string $className, ClassMetadata $class)
124 {
125 $this->loadedMetadata[$this->normalizeClassName($className)] = $class;
126 }
127 protected function getParentClasses(string $name)
128 {
129 // Collect parent classes, ignoring transient (not-mapped) classes.
130 $parentClasses = [];
131 foreach (array_reverse($this->getReflectionService()->getParentClasses($name)) as $parentClass) {
132 if ($this->getDriver()->isTransient($parentClass)) {
133 continue;
134 }
135 $parentClasses[] = $parentClass;
136 }
137 return $parentClasses;
138 }
139 protected function loadMetadata(string $name)
140 {
141 if (!$this->initialized) {
142 $this->initialize();
143 }
144 $loaded = [];
145 $parentClasses = $this->getParentClasses($name);
146 $parentClasses[] = $name;
147 // Move down the hierarchy of parent classes, starting from the topmost ?class
148 $parent = null;
149 $rootEntityFound = \false;
150 $visited = [];
151 $reflService = $this->getReflectionService();
152 foreach ($parentClasses as $className) {
153 if (isset($this->loadedMetadata[$className])) {
154 $parent = $this->loadedMetadata[$className];
155 if ($this->isEntity($parent)) {
156 $rootEntityFound = \true;
157 array_unshift($visited, $className);
158 }
159 continue;
160 }
161 $class = $this->newClassMetadataInstance($className);
162 $this->initializeReflection($class, $reflService);
163 $this->doLoadMetadata($class, $parent, $rootEntityFound, $visited);
164 $this->loadedMetadata[$className] = $class;
165 $parent = $class;
166 if ($this->isEntity($class)) {
167 $rootEntityFound = \true;
168 array_unshift($visited, $className);
169 }
170 $this->wakeupReflection($class, $reflService);
171 $loaded[] = $className;
172 }
173 return $loaded;
174 }
175 protected function onNotFoundMetadata(string $className)
176 {
177 return null;
178 }
179 protected abstract function doLoadMetadata(ClassMetadata $class, ?ClassMetadata $parent, bool $rootEntityFound, array $nonSuperclassParents);
180 protected abstract function newClassMetadataInstance(string $className);
181 public function isTransient(string $className)
182 {
183 if (!$this->initialized) {
184 $this->initialize();
185 }
186 if (class_exists($className, \false) && (new ReflectionClass($className))->isAnonymous()) {
187 return \false;
188 }
189 if (!class_exists($className, \false) && strpos($className, ':') !== \false) {
190 throw MappingException::nonExistingClass($className);
191 }
192 return $this->getDriver()->isTransient($className);
193 }
194 public function setReflectionService(ReflectionService $reflectionService)
195 {
196 $this->reflectionService = $reflectionService;
197 }
198 public function getReflectionService()
199 {
200 if ($this->reflectionService === null) {
201 $this->reflectionService = new RuntimeReflectionService();
202 }
203 return $this->reflectionService;
204 }
205 protected function getCacheKey(string $realClassName) : string
206 {
207 return str_replace('\\', '__', $realClassName) . $this->cacheSalt;
208 }
209 private function getRealClass(string $class) : string
210 {
211 if ($this->proxyClassNameResolver === null) {
212 $this->createDefaultProxyClassNameResolver();
213 }
214 assert($this->proxyClassNameResolver !== null);
215 return $this->proxyClassNameResolver->resolveClassName($class);
216 }
217 private function createDefaultProxyClassNameResolver() : void
218 {
219 $this->proxyClassNameResolver = new class implements ProxyClassNameResolver
220 {
221 public function resolveClassName(string $className) : string
222 {
223 $pos = strrpos($className, '\\' . Proxy::MARKER . '\\');
224 if ($pos === \false) {
225 return $className;
226 }
227 return substr($className, $pos + Proxy::MARKER_LENGTH + 2);
228 }
229 };
230 }
231 }
232