From bf6655a534a6775d30cafa67bd801276bda1d98d Mon Sep 17 00:00:00 2001 From: polo Date: Tue, 13 Aug 2024 23:45:21 +0200 Subject: =?UTF-8?q?VERSION=200.2=20doctrine=20ORM=20et=20entit=C3=A9s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Reflection/EnumReflectionProperty.php | 181 +++++++++++++++++++++ .../Reflection/RuntimePublicReflectionProperty.php | 61 +++++++ .../Reflection/RuntimeReflectionProperty.php | 87 ++++++++++ .../TypedNoDefaultReflectionProperty.php | 13 ++ .../TypedNoDefaultReflectionPropertyBase.php | 68 ++++++++ ...pedNoDefaultRuntimePublicReflectionProperty.php | 15 ++ 6 files changed, 425 insertions(+) create mode 100644 vendor/doctrine/persistence/src/Persistence/Reflection/EnumReflectionProperty.php create mode 100644 vendor/doctrine/persistence/src/Persistence/Reflection/RuntimePublicReflectionProperty.php create mode 100644 vendor/doctrine/persistence/src/Persistence/Reflection/RuntimeReflectionProperty.php create mode 100644 vendor/doctrine/persistence/src/Persistence/Reflection/TypedNoDefaultReflectionProperty.php create mode 100644 vendor/doctrine/persistence/src/Persistence/Reflection/TypedNoDefaultReflectionPropertyBase.php create mode 100644 vendor/doctrine/persistence/src/Persistence/Reflection/TypedNoDefaultRuntimePublicReflectionProperty.php (limited to 'vendor/doctrine/persistence/src/Persistence/Reflection') diff --git a/vendor/doctrine/persistence/src/Persistence/Reflection/EnumReflectionProperty.php b/vendor/doctrine/persistence/src/Persistence/Reflection/EnumReflectionProperty.php new file mode 100644 index 0000000..114b9db --- /dev/null +++ b/vendor/doctrine/persistence/src/Persistence/Reflection/EnumReflectionProperty.php @@ -0,0 +1,181 @@ + */ + private $enumType; + + /** @param class-string $enumType */ + public function __construct(ReflectionProperty $originalReflectionProperty, string $enumType) + { + $this->originalReflectionProperty = $originalReflectionProperty; + $this->enumType = $enumType; + } + + /** + * {@inheritDoc} + * + * @psalm-external-mutation-free + */ + public function getDeclaringClass(): ReflectionClass + { + return $this->originalReflectionProperty->getDeclaringClass(); + } + + /** + * {@inheritDoc} + * + * @psalm-external-mutation-free + */ + public function getName(): string + { + return $this->originalReflectionProperty->getName(); + } + + /** + * {@inheritDoc} + * + * @psalm-external-mutation-free + */ + public function getType(): ?ReflectionType + { + return $this->originalReflectionProperty->getType(); + } + + /** + * {@inheritDoc} + */ + public function getAttributes(?string $name = null, int $flags = 0): array + { + return $this->originalReflectionProperty->getAttributes($name, $flags); + } + + /** + * {@inheritDoc} + * + * Converts enum instance to its value. + * + * @param object|null $object + * + * @return int|string|int[]|string[]|null + */ + #[ReturnTypeWillChange] + public function getValue($object = null) + { + if ($object === null) { + return null; + } + + $enum = $this->originalReflectionProperty->getValue($object); + + if ($enum === null) { + return null; + } + + return $this->fromEnum($enum); + } + + /** + * Converts enum value to enum instance. + * + * @param object $object + * @param mixed $value + */ + public function setValue($object, $value = null): void + { + if ($value !== null) { + $value = $this->toEnum($value); + } + + $this->originalReflectionProperty->setValue($object, $value); + } + + /** + * @param BackedEnum|BackedEnum[] $enum + * + * @return ($enum is BackedEnum ? (string|int) : (string[]|int[])) + */ + private function fromEnum($enum) + { + if (is_array($enum)) { + return array_map(static function (BackedEnum $enum) { + return $enum->value; + }, $enum); + } + + return $enum->value; + } + + /** + * @param int|string|int[]|string[]|BackedEnum|BackedEnum[] $value + * + * @return ($value is int|string|BackedEnum ? BackedEnum : BackedEnum[]) + */ + private function toEnum($value) + { + if ($value instanceof BackedEnum) { + return $value; + } + + if (is_array($value)) { + $v = reset($value); + if ($v instanceof BackedEnum) { + return $value; + } + + return array_map([$this->enumType, 'from'], $value); + } + + return $this->enumType::from($value); + } + + /** + * {@inheritDoc} + * + * @psalm-external-mutation-free + */ + public function getModifiers(): int + { + return $this->originalReflectionProperty->getModifiers(); + } + + /** + * {@inheritDoc} + * + * @psalm-external-mutation-free + */ + public function getDocComment(): string|false + { + return $this->originalReflectionProperty->getDocComment(); + } + + /** + * {@inheritDoc} + * + * @psalm-external-mutation-free + */ + public function isPrivate(): bool + { + return $this->originalReflectionProperty->isPrivate(); + } +} diff --git a/vendor/doctrine/persistence/src/Persistence/Reflection/RuntimePublicReflectionProperty.php b/vendor/doctrine/persistence/src/Persistence/Reflection/RuntimePublicReflectionProperty.php new file mode 100644 index 0000000..e2367ec --- /dev/null +++ b/vendor/doctrine/persistence/src/Persistence/Reflection/RuntimePublicReflectionProperty.php @@ -0,0 +1,61 @@ +getName()] ?? null : parent::getValue(); + } + + /** + * {@inheritDoc} + * + * Avoids triggering lazy loading via `__set` if the provided object + * is a {@see \Doctrine\Common\Proxy\Proxy}. + * + * @link https://bugs.php.net/bug.php?id=63463 + * + * @param object|null $object + * @param mixed $value + * + * @return void + */ + #[ReturnTypeWillChange] + public function setValue($object, $value = null) + { + if (! ($object instanceof Proxy && ! $object->__isInitialized())) { + parent::setValue($object, $value); + + return; + } + + $originalInitializer = $object->__getInitializer(); + $object->__setInitializer(null); + + parent::setValue($object, $value); + + $object->__setInitializer($originalInitializer); + } +} diff --git a/vendor/doctrine/persistence/src/Persistence/Reflection/RuntimeReflectionProperty.php b/vendor/doctrine/persistence/src/Persistence/Reflection/RuntimeReflectionProperty.php new file mode 100644 index 0000000..5f52056 --- /dev/null +++ b/vendor/doctrine/persistence/src/Persistence/Reflection/RuntimeReflectionProperty.php @@ -0,0 +1,87 @@ +key = $this->isPrivate() ? "\0" . ltrim($class, '\\') . "\0" . $name : ($this->isProtected() ? "\0*\0" . $name : $name); + } + + /** + * {@inheritDoc} + * + * @return mixed + */ + #[ReturnTypeWillChange] + public function getValue($object = null) + { + if ($object === null) { + return parent::getValue($object); + } + + return ((array) $object)[$this->key] ?? null; + } + + /** + * {@inheritDoc} + * + * @param object|null $object + * @param mixed $value + * + * @return void + */ + #[ReturnTypeWillChange] + public function setValue($object, $value = null) + { + if (! ($object instanceof Proxy && ! $object->__isInitialized())) { + parent::setValue($object, $value); + + return; + } + + if ($object instanceof CommonProxy) { + $originalInitializer = $object->__getInitializer(); + $object->__setInitializer(null); + + parent::setValue($object, $value); + + $object->__setInitializer($originalInitializer); + + return; + } + + if (! method_exists($object, '__setInitialized')) { + return; + } + + $object->__setInitialized(true); + + parent::setValue($object, $value); + + $object->__setInitialized(false); + } +} diff --git a/vendor/doctrine/persistence/src/Persistence/Reflection/TypedNoDefaultReflectionProperty.php b/vendor/doctrine/persistence/src/Persistence/Reflection/TypedNoDefaultReflectionProperty.php new file mode 100644 index 0000000..5e70620 --- /dev/null +++ b/vendor/doctrine/persistence/src/Persistence/Reflection/TypedNoDefaultReflectionProperty.php @@ -0,0 +1,13 @@ +isInitialized($object) ? parent::getValue($object) : null; + } + + /** + * {@inheritDoc} + * + * Works around the problem with setting typed no default properties to + * NULL which is not supported, instead unset() to uninitialize. + * + * @link https://github.com/doctrine/orm/issues/7999 + * + * @param object|null $object + * + * @return void + */ + #[ReturnTypeWillChange] + public function setValue($object, $value = null) + { + if ($value === null && $this->hasType() && ! $this->getType()->allowsNull()) { + $propertyName = $this->getName(); + + $unsetter = function () use ($propertyName): void { + unset($this->$propertyName); + }; + $unsetter = $unsetter->bindTo($object, $this->getDeclaringClass()->getName()); + + assert($unsetter instanceof Closure); + + $unsetter(); + + return; + } + + parent::setValue($object, $value); + } +} diff --git a/vendor/doctrine/persistence/src/Persistence/Reflection/TypedNoDefaultRuntimePublicReflectionProperty.php b/vendor/doctrine/persistence/src/Persistence/Reflection/TypedNoDefaultRuntimePublicReflectionProperty.php new file mode 100644 index 0000000..181172f --- /dev/null +++ b/vendor/doctrine/persistence/src/Persistence/Reflection/TypedNoDefaultRuntimePublicReflectionProperty.php @@ -0,0 +1,15 @@ +