akeup'); return function (CommonProxy $proxy) use($entityPersister, $classMetadata, $wakeupProxy) : void { $initializer = $proxy->__getInitializer(); $cloner = $proxy->__getCloner(); $proxy->__setInitializer(null); $proxy->__setCloner(null); if ($proxy->__isInitialized()) { return; } $properties = $proxy->__getLazyProperties(); foreach ($properties as $propertyName => $property) { if (!isset($proxy->{$propertyName})) { $proxy->{$propertyName} = $properties[$propertyName]; } } $proxy->__setInitialized(\true); if ($wakeupProxy) { $proxy->__wakeup(); } $identifier = $classMetadata->getIdentifierValues($proxy); if ($entityPersister->loadById($identifier, $proxy) === null) { $proxy->__setInitializer($initializer); $proxy->__setCloner($cloner); $proxy->__setInitialized(\false); throw EntityNotFoundException::fromClassNameAndIdentifier($classMetadata->getName(), $this->identifierFlattener->flattenIdentifier($classMetadata, $identifier)); } }; } private function createLazyInitializer(ClassMetadata $classMetadata, EntityPersister $entityPersister) : Closure { return function (Proxy $proxy) use($entityPersister, $classMetadata) : void { $identifier = $classMetadata->getIdentifierValues($proxy); $entity = $entityPersister->loadById($identifier, $proxy->__isCloning ? null : $proxy); if ($entity === null) { throw EntityNotFoundException::fromClassNameAndIdentifier($classMetadata->getName(), $this->identifierFlattener->flattenIdentifier($classMetadata, $identifier)); } if (!$proxy->__isCloning) { return; } $class = $entityPersister->getClassMetadata(); foreach ($class->getReflectionProperties() as $property) { if (!$class->hasField($property->name) && !$class->hasAssociation($property->name)) { continue; } $property->setAccessible(\true); $property->setValue($proxy, $property->getValue($entity)); } }; } private function createCloner(ClassMetadata $classMetadata, EntityPersister $entityPersister) : Closure { return function (CommonProxy $proxy) use($entityPersister, $classMetadata) : void { if ($proxy->__isInitialized()) { return; } $proxy->__setInitialized(\true); $proxy->__setInitializer(null); $class = $entityPersister->getClassMetadata(); $identifier = $classMetadata->getIdentifierValues($proxy); $original = $entityPersister->loadById($identifier); if ($original === null) { throw EntityNotFoundException::fromClassNameAndIdentifier($classMetadata->getName(), $this->identifierFlattener->flattenIdentifier($classMetadata, $identifier)); } foreach ($class->getReflectionProperties() as $property) { if (!$class->hasField($property->name) && !$class->hasAssociation($property->name)) { continue; } $property->setAccessible(\true); $property->setValue($proxy, $property->getValue($original)); } }; } private function generateUseLazyGhostTrait(ClassMetadata $class) : string { $code = ProxyHelper::generateLazyGhost($class->getReflectionClass()); $code = substr($code, 7 + (int) strpos($code, "\n{")); $code = substr($code, 0, (int) strpos($code, "\n}")); $code = str_replace('LazyGhostTrait;', str_replace("\n ", "\n", 'LazyGhostTrait { initializeLazyObject as __load; setLazyObjectAsInitialized as public __setInitialized; isLazyObjectInitialized as private; createLazyGhost as private; resetLazyObject as private; __clone as private __doClone; }'), $code); return $code; } private function generateSkippedProperties(ClassMetadata $class) : string { $skippedProperties = ['__isCloning' => \true]; $identifiers = array_flip($class->getIdentifierFieldNames()); $filter = ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED | ReflectionProperty::IS_PRIVATE; $reflector = $class->getReflectionClass(); while ($reflector) { foreach ($reflector->getProperties($filter) as $property) { $name = $property->getName(); if ($property->isStatic() || ($class->hasField($name) || $class->hasAssociation($name)) && !isset($identifiers[$name])) { continue; } $prefix = $property->isPrivate() ? "\x00" . $property->getDeclaringClass()->getName() . "\x00" : ($property->isProtected() ? "\x00*\x00" : ''); $skippedProperties[$prefix . $name] = \true; } $filter = ReflectionProperty::IS_PRIVATE; $reflector = $reflector->getParentClass(); } uksort($skippedProperties, 'strnatcmp'); $code = VarExporter::export($skippedProperties); $code = str_replace(VarExporter::export($class->getName()), 'parent::class', $code); $code = str_replace("\n", "\n ", $code); return $code; } private function generateSerializeImpl(ClassMetadata $class) : string { $reflector = $class->getReflectionClass(); $properties = $reflector->hasMethod('__serialize') ? 'parent::__serialize()' : '(array) $this'; $code = '$properties = ' . $properties . '; unset($properties["\\0" . self::class . "\\0lazyObjectState"], $properties[\'__isCloning\']); '; if ($reflector->hasMethod('__serialize') || !$reflector->hasMethod('__sleep')) { return $code . 'return $properties;'; } return $code . '$data = []; foreach (parent::__sleep() as $name) { $value = $properties[$k = $name] ?? $properties[$k = "\\0*\\0$name"] ?? $properties[$k = "\\0' . $reflector->getName() . '\\0$name"] ?? $k = null; if (null === $k) { trigger_error(sprintf(\'serialize(): "%s" returned as member variable from __sleep() but does not exist\', $name), \\E_USER_NOTICE); } else { $data[$k] = $value; } } return $data;'; } }