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 / orm / src / Proxy / ProxyFactory.php
mailpoet / vendor-prefixed / doctrine / orm / src / Proxy Last commit date
Autoloader.php 9 months ago DefaultProxyClassNameResolver.php 9 months ago InternalProxy.php 9 months ago Proxy.php 9 months ago ProxyFactory.php 9 months ago index.php 9 months ago
ProxyFactory.php
378 lines
1 <?php
2 declare (strict_types=1);
3 namespace MailPoetVendor\Doctrine\ORM\Proxy;
4 if (!defined('ABSPATH')) exit;
5 use Closure;
6 use MailPoetVendor\Doctrine\Common\Proxy\AbstractProxyFactory;
7 use MailPoetVendor\Doctrine\Common\Proxy\Proxy as CommonProxy;
8 use MailPoetVendor\Doctrine\Common\Proxy\ProxyDefinition;
9 use MailPoetVendor\Doctrine\Common\Proxy\ProxyGenerator;
10 use MailPoetVendor\Doctrine\Deprecations\Deprecation;
11 use MailPoetVendor\Doctrine\ORM\EntityManagerInterface;
12 use MailPoetVendor\Doctrine\ORM\EntityNotFoundException;
13 use MailPoetVendor\Doctrine\ORM\ORMInvalidArgumentException;
14 use MailPoetVendor\Doctrine\ORM\Persisters\Entity\EntityPersister;
15 use MailPoetVendor\Doctrine\ORM\Proxy\Proxy as LegacyProxy;
16 use MailPoetVendor\Doctrine\ORM\UnitOfWork;
17 use MailPoetVendor\Doctrine\ORM\Utility\IdentifierFlattener;
18 use MailPoetVendor\Doctrine\Persistence\Mapping\ClassMetadata;
19 use MailPoetVendor\Doctrine\Persistence\Proxy;
20 use ReflectionProperty;
21 use MailPoetVendor\Symfony\Component\VarExporter\ProxyHelper;
22 use Throwable;
23 use function array_combine;
24 use function array_flip;
25 use function array_intersect_key;
26 use function bin2hex;
27 use function chmod;
28 use function class_exists;
29 use function dirname;
30 use function file_exists;
31 use function file_put_contents;
32 use function filemtime;
33 use function is_bool;
34 use function is_dir;
35 use function is_int;
36 use function is_writable;
37 use function ltrim;
38 use function mkdir;
39 use function preg_match_all;
40 use function random_bytes;
41 use function rename;
42 use function rtrim;
43 use function str_replace;
44 use function strpos;
45 use function strrpos;
46 use function strtr;
47 use function substr;
48 use function ucfirst;
49 use const DIRECTORY_SEPARATOR;
50 use const PHP_VERSION_ID;
51 class ProxyFactory extends AbstractProxyFactory
52 {
53 public const AUTOGENERATE_NEVER = 0;
54 public const AUTOGENERATE_ALWAYS = 1;
55 public const AUTOGENERATE_FILE_NOT_EXISTS = 2;
56 public const AUTOGENERATE_EVAL = 3;
57 public const AUTOGENERATE_FILE_NOT_EXISTS_OR_CHANGED = 4;
58 private const PROXY_CLASS_TEMPLATE = <<<'EOPHP'
59 <?php
60 namespace <namespace>;
61 class <proxyShortClassName> extends \<className> implements \<baseProxyInterface>
62 {
63 <useLazyGhostTrait>
64 public function __isInitialized(): bool
65 {
66 return isset($this->lazyObjectState) && $this->isLazyObjectInitialized();
67 }
68 public function __serialize(): array
69 {
70 <serializeImpl>
71 }
72 }
73 EOPHP;
74 private $em;
75 private $uow;
76 private $proxyDir;
77 private $proxyNs;
78 private $autoGenerate;
79 private $identifierFlattener;
80 private $proxyFactories = [];
81 private $isLazyGhostObjectEnabled = \true;
82 public function __construct(EntityManagerInterface $em, $proxyDir, $proxyNs, $autoGenerate = self::AUTOGENERATE_NEVER)
83 {
84 if (!$em->getConfiguration()->isLazyGhostObjectEnabled()) {
85 if (PHP_VERSION_ID >= 80100) {
86 Deprecation::trigger('doctrine/orm', 'https://github.com/doctrine/orm/pull/10837/', 'Not enabling lazy ghost objects is deprecated and will not be supported in Doctrine ORM 3.0. Ensure Doctrine\\ORM\\Configuration::setLazyGhostObjectEnabled(true) is called to enable them.');
87 }
88 $this->isLazyGhostObjectEnabled = \false;
89 // @phpstan-ignore new.deprecatedClass, method.deprecatedClass
90 $proxyGenerator = new ProxyGenerator($proxyDir, $proxyNs);
91 // @phpstan-ignore classConstant.deprecatedInterface, method.deprecatedClass
92 $proxyGenerator->setPlaceholder('baseProxyInterface', LegacyProxy::class);
93 // @phpstan-ignore method.deprecatedClass
94 parent::__construct($proxyGenerator, $em->getMetadataFactory(), $autoGenerate);
95 }
96 if (!$proxyDir) {
97 throw ORMInvalidArgumentException::proxyDirectoryRequired();
98 }
99 if (!$proxyNs) {
100 throw ORMInvalidArgumentException::proxyNamespaceRequired();
101 }
102 if (is_int($autoGenerate) ? $autoGenerate < 0 || $autoGenerate > 4 : !is_bool($autoGenerate)) {
103 throw ORMInvalidArgumentException::invalidAutoGenerateMode($autoGenerate);
104 }
105 $this->em = $em;
106 $this->uow = $em->getUnitOfWork();
107 $this->proxyDir = $proxyDir;
108 $this->proxyNs = $proxyNs;
109 $this->autoGenerate = (int) $autoGenerate;
110 $this->identifierFlattener = new IdentifierFlattener($this->uow, $em->getMetadataFactory());
111 }
112 public function getProxy($className, array $identifier)
113 {
114 if (!$this->isLazyGhostObjectEnabled) {
115 // @phpstan-ignore method.deprecatedClass
116 return parent::getProxy($className, $identifier);
117 }
118 $proxyFactory = $this->proxyFactories[$className] ?? $this->getProxyFactory($className);
119 return $proxyFactory($identifier);
120 }
121 public function generateProxyClasses(array $classes, $proxyDir = null)
122 {
123 if (!$this->isLazyGhostObjectEnabled) {
124 // @phpstan-ignore method.deprecatedClass
125 return parent::generateProxyClasses($classes, $proxyDir);
126 }
127 $generated = 0;
128 foreach ($classes as $class) {
129 if ($this->skipClass($class)) {
130 continue;
131 }
132 $proxyFileName = $this->getProxyFileName($class->getName(), $proxyDir ?: $this->proxyDir);
133 $proxyClassName = self::generateProxyClassName($class->getName(), $this->proxyNs);
134 $this->generateProxyClass($class, $proxyFileName, $proxyClassName);
135 ++$generated;
136 }
137 return $generated;
138 }
139 public function resetUninitializedProxy(CommonProxy $proxy)
140 {
141 return parent::resetUninitializedProxy($proxy);
142 }
143 protected function skipClass(ClassMetadata $metadata)
144 {
145 return $metadata->isMappedSuperclass || $metadata->isEmbeddedClass || $metadata->getReflectionClass()->isAbstract();
146 }
147 protected function createProxyDefinition($className)
148 {
149 $classMetadata = $this->em->getClassMetadata($className);
150 $entityPersister = $this->uow->getEntityPersister($className);
151 $initializer = $this->createInitializer($classMetadata, $entityPersister);
152 $cloner = $this->createCloner($classMetadata, $entityPersister);
153 return new ProxyDefinition(self::generateProxyClassName($className, $this->proxyNs), $classMetadata->getIdentifierFieldNames(), $classMetadata->getReflectionProperties(), $initializer, $cloner);
154 }
155 private function createInitializer(ClassMetadata $classMetadata, EntityPersister $entityPersister) : Closure
156 {
157 $wakeupProxy = $classMetadata->getReflectionClass()->hasMethod('__wakeup');
158 return function (CommonProxy $proxy) use($entityPersister, $classMetadata, $wakeupProxy) : void {
159 $initializer = $proxy->__getInitializer();
160 $cloner = $proxy->__getCloner();
161 $proxy->__setInitializer(null);
162 $proxy->__setCloner(null);
163 if ($proxy->__isInitialized()) {
164 return;
165 }
166 $properties = $proxy->__getLazyProperties();
167 foreach ($properties as $propertyName => $property) {
168 if (!isset($proxy->{$propertyName})) {
169 $proxy->{$propertyName} = $properties[$propertyName];
170 }
171 }
172 $proxy->__setInitialized(\true);
173 if ($wakeupProxy) {
174 $proxy->__wakeup();
175 }
176 $identifier = $classMetadata->getIdentifierValues($proxy);
177 try {
178 $entity = $entityPersister->loadById($identifier, $proxy);
179 } catch (Throwable $exception) {
180 $proxy->__setInitializer($initializer);
181 $proxy->__setCloner($cloner);
182 $proxy->__setInitialized(\false);
183 throw $exception;
184 }
185 if ($entity === null) {
186 $proxy->__setInitializer($initializer);
187 $proxy->__setCloner($cloner);
188 $proxy->__setInitialized(\false);
189 throw EntityNotFoundException::fromClassNameAndIdentifier($classMetadata->getName(), $this->identifierFlattener->flattenIdentifier($classMetadata, $identifier));
190 }
191 };
192 }
193 private function createLazyInitializer(ClassMetadata $classMetadata, EntityPersister $entityPersister, IdentifierFlattener $identifierFlattener) : Closure
194 {
195 return static function (InternalProxy $proxy, array $identifier) use($entityPersister, $classMetadata, $identifierFlattener) : void {
196 $original = $entityPersister->loadById($identifier);
197 if ($original === null) {
198 throw EntityNotFoundException::fromClassNameAndIdentifier($classMetadata->getName(), $identifierFlattener->flattenIdentifier($classMetadata, $identifier));
199 }
200 if ($proxy === $original) {
201 return;
202 }
203 $class = $entityPersister->getClassMetadata();
204 foreach ($class->getReflectionProperties() as $property) {
205 if (isset($identifier[$property->name])) {
206 continue;
207 }
208 $property->setValue($proxy, $property->getValue($original));
209 }
210 };
211 }
212 private function createCloner(ClassMetadata $classMetadata, EntityPersister $entityPersister) : Closure
213 {
214 return function (CommonProxy $proxy) use($entityPersister, $classMetadata) : void {
215 if ($proxy->__isInitialized()) {
216 return;
217 }
218 $proxy->__setInitialized(\true);
219 $proxy->__setInitializer(null);
220 $class = $entityPersister->getClassMetadata();
221 $identifier = $classMetadata->getIdentifierValues($proxy);
222 $original = $entityPersister->loadById($identifier);
223 if ($original === null) {
224 throw EntityNotFoundException::fromClassNameAndIdentifier($classMetadata->getName(), $this->identifierFlattener->flattenIdentifier($classMetadata, $identifier));
225 }
226 foreach ($class->getReflectionProperties() as $property) {
227 if (!$class->hasField($property->name) && !$class->hasAssociation($property->name)) {
228 continue;
229 }
230 if (PHP_VERSION_ID < 80100) {
231 $property->setAccessible(\true);
232 }
233 $property->setValue($proxy, $property->getValue($original));
234 }
235 };
236 }
237 private function getProxyFileName(string $className, string $baseDirectory) : string
238 {
239 $baseDirectory = $baseDirectory ?: $this->proxyDir;
240 return rtrim($baseDirectory, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . InternalProxy::MARKER . str_replace('\\', '', $className) . '.php';
241 }
242 private function getProxyFactory(string $className) : Closure
243 {
244 $skippedProperties = [];
245 $class = $this->em->getClassMetadata($className);
246 $identifiers = array_flip($class->getIdentifierFieldNames());
247 $filter = ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED | ReflectionProperty::IS_PRIVATE;
248 $reflector = $class->getReflectionClass();
249 while ($reflector) {
250 foreach ($reflector->getProperties($filter) as $property) {
251 $name = $property->name;
252 if ($property->isStatic() || !isset($identifiers[$name])) {
253 continue;
254 }
255 $prefix = $property->isPrivate() ? "\x00" . $property->class . "\x00" : ($property->isProtected() ? "\x00*\x00" : '');
256 $skippedProperties[$prefix . $name] = \true;
257 }
258 $filter = ReflectionProperty::IS_PRIVATE;
259 $reflector = $reflector->getParentClass();
260 }
261 $className = $class->getName();
262 // aliases and case sensitivity
263 $entityPersister = $this->uow->getEntityPersister($className);
264 $initializer = $this->createLazyInitializer($class, $entityPersister, $this->identifierFlattener);
265 $proxyClassName = $this->loadProxyClass($class);
266 $identifierFields = array_intersect_key($class->getReflectionProperties(), $identifiers);
267 $proxyFactory = Closure::bind(static function (array $identifier) use($initializer, $skippedProperties, $identifierFields, $className) : InternalProxy {
268 $proxy = self::createLazyGhost(static function (InternalProxy $object) use($initializer, $identifier) : void {
269 $initializer($object, $identifier);
270 }, $skippedProperties);
271 foreach ($identifierFields as $idField => $reflector) {
272 if (!isset($identifier[$idField])) {
273 throw ORMInvalidArgumentException::missingPrimaryKeyValue($className, $idField);
274 }
275 $reflector->setValue($proxy, $identifier[$idField]);
276 }
277 return $proxy;
278 }, null, $proxyClassName);
279 return $this->proxyFactories[$className] = $proxyFactory;
280 }
281 private function loadProxyClass(ClassMetadata $class) : string
282 {
283 $proxyClassName = self::generateProxyClassName($class->getName(), $this->proxyNs);
284 if (class_exists($proxyClassName, \false)) {
285 return $proxyClassName;
286 }
287 if ($this->autoGenerate === self::AUTOGENERATE_EVAL) {
288 $this->generateProxyClass($class, null, $proxyClassName);
289 return $proxyClassName;
290 }
291 $fileName = $this->getProxyFileName($class->getName(), $this->proxyDir);
292 switch ($this->autoGenerate) {
293 case self::AUTOGENERATE_FILE_NOT_EXISTS_OR_CHANGED:
294 if (file_exists($fileName) && filemtime($fileName) >= filemtime($class->getReflectionClass()->getFileName())) {
295 break;
296 }
297 // no break
298 case self::AUTOGENERATE_FILE_NOT_EXISTS:
299 if (file_exists($fileName)) {
300 break;
301 }
302 // no break
303 case self::AUTOGENERATE_ALWAYS:
304 $this->generateProxyClass($class, $fileName, $proxyClassName);
305 break;
306 }
307 require $fileName;
308 return $proxyClassName;
309 }
310 private function generateProxyClass(ClassMetadata $class, ?string $fileName, string $proxyClassName) : void
311 {
312 $i = strrpos($proxyClassName, '\\');
313 $placeholders = ['<className>' => $class->getName(), '<namespace>' => substr($proxyClassName, 0, $i), '<proxyShortClassName>' => substr($proxyClassName, 1 + $i), '<baseProxyInterface>' => InternalProxy::class];
314 preg_match_all('(<([a-zA-Z]+)>)', self::PROXY_CLASS_TEMPLATE, $placeholderMatches);
315 foreach (array_combine($placeholderMatches[0], $placeholderMatches[1]) as $placeholder => $name) {
316 $placeholders[$placeholder] ?? ($placeholders[$placeholder] = $this->{'generate' . ucfirst($name)}($class));
317 }
318 $proxyCode = strtr(self::PROXY_CLASS_TEMPLATE, $placeholders);
319 if (!$fileName) {
320 if (!class_exists($proxyClassName)) {
321 eval(substr($proxyCode, 5));
322 }
323 return;
324 }
325 $parentDirectory = dirname($fileName);
326 if (!is_dir($parentDirectory) && !@mkdir($parentDirectory, 0775, \true)) {
327 throw ORMInvalidArgumentException::proxyDirectoryNotWritable($this->proxyDir);
328 }
329 if (!is_writable($parentDirectory)) {
330 throw ORMInvalidArgumentException::proxyDirectoryNotWritable($this->proxyDir);
331 }
332 $tmpFileName = $fileName . '.' . bin2hex(random_bytes(12));
333 file_put_contents($tmpFileName, $proxyCode);
334 @chmod($tmpFileName, 0664);
335 rename($tmpFileName, $fileName);
336 }
337 private function generateUseLazyGhostTrait(ClassMetadata $class) : string
338 {
339 // @phpstan-ignore staticMethod.deprecated (Because we support Symfony < 7.3)
340 $code = ProxyHelper::generateLazyGhost($class->getReflectionClass());
341 $code = substr($code, 7 + (int) strpos($code, "\n{"));
342 $code = substr($code, 0, (int) strpos($code, "\n}"));
343 $code = str_replace('LazyGhostTrait;', str_replace("\n ", "\n", 'LazyGhostTrait {
344 initializeLazyObject as __load;
345 setLazyObjectAsInitialized as public __setInitialized;
346 isLazyObjectInitialized as private;
347 createLazyGhost as private;
348 resetLazyObject as private;
349 }'), $code);
350 return $code;
351 }
352 private function generateSerializeImpl(ClassMetadata $class) : string
353 {
354 $reflector = $class->getReflectionClass();
355 $properties = $reflector->hasMethod('__serialize') ? 'parent::__serialize()' : '(array) $this';
356 $code = '$properties = ' . $properties . ';
357 unset($properties["\\0" . self::class . "\\0lazyObjectState"]);
358 ';
359 if ($reflector->hasMethod('__serialize') || !$reflector->hasMethod('__sleep')) {
360 return $code . 'return $properties;';
361 }
362 return $code . '$data = [];
363 foreach (parent::__sleep() as $name) {
364 $value = $properties[$k = $name] ?? $properties[$k = "\\0*\\0$name"] ?? $properties[$k = "\\0' . $reflector->name . '\\0$name"] ?? $k = null;
365 if (null === $k) {
366 trigger_error(sprintf(\'serialize(): "%s" returned as member variable from __sleep() but does not exist\', $name), \\E_USER_NOTICE);
367 } else {
368 $data[$k] = $value;
369 }
370 }
371 return $data;';
372 }
373 private static function generateProxyClassName(string $className, string $proxyNamespace) : string
374 {
375 return rtrim($proxyNamespace, '\\') . '\\' . Proxy::MARKER . '\\' . ltrim($className, '\\');
376 }
377 }
378