diff --git a/CHANGELOG.md b/CHANGELOG.md index c7695c9d..779d9515 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ * chore: rector run * chore: refactor `ObjectToObjectMetadataFactory` for clarity * chore: refactor `PropertyMappingResolver` +* chore: cleanup ## 1.8.0 diff --git a/src/Transformer/EagerPropertiesResolver/EagerPropertiesResolverInterface.php b/src/Transformer/EagerPropertiesResolver/EagerPropertiesResolverInterface.php index 36050c10..9525634d 100644 --- a/src/Transformer/EagerPropertiesResolver/EagerPropertiesResolverInterface.php +++ b/src/Transformer/EagerPropertiesResolver/EagerPropertiesResolverInterface.php @@ -21,7 +21,7 @@ interface EagerPropertiesResolverInterface * object's identifier is eager. * * @param class-string $sourceClass - * @return array + * @return list */ public function getEagerProperties(string $sourceClass): array; } diff --git a/src/Transformer/EagerPropertiesResolver/Implementation/DoctrineEagerPropertiesResolver.php b/src/Transformer/EagerPropertiesResolver/Implementation/DoctrineEagerPropertiesResolver.php index 280410f7..4a607375 100644 --- a/src/Transformer/EagerPropertiesResolver/Implementation/DoctrineEagerPropertiesResolver.php +++ b/src/Transformer/EagerPropertiesResolver/Implementation/DoctrineEagerPropertiesResolver.php @@ -39,6 +39,6 @@ public function getEagerProperties(string $sourceClass): array return []; } - return $metadata->getIdentifierFieldNames(); + return array_values($metadata->getIdentifierFieldNames()); } } diff --git a/src/Transformer/ObjectToObjectMetadata/Implementation/ObjectToObjectMetadataFactory.php b/src/Transformer/ObjectToObjectMetadata/Implementation/ObjectToObjectMetadataFactory.php index 5eef0997..93c9f92d 100644 --- a/src/Transformer/ObjectToObjectMetadata/Implementation/ObjectToObjectMetadataFactory.php +++ b/src/Transformer/ObjectToObjectMetadata/Implementation/ObjectToObjectMetadataFactory.php @@ -260,51 +260,72 @@ class: $targetClass, // create proxy if possible try { - // ensure we can create the proxy + [$skippedProperties, $constructorIsEager] = $this->getProxyParameters( + targetClass: $targetClass, + eagerProperties: $eagerProperties, + constructorPropertyMappings: $objectToObjectMetadata + ->getConstructorPropertyMappings(), + ); - $this->proxyFactory - ->createProxy($targetClass, function ($instance): void {}, $eagerProperties); + $objectToObjectMetadata = $objectToObjectMetadata->withTargetProxy( + targetProxySkippedProperties: $skippedProperties, + constructorIsEager: $constructorIsEager, + ); + } catch (ProxyNotSupportedException $e) { + $objectToObjectMetadata = $objectToObjectMetadata + ->withReasonCannotUseProxy($e->getReason()); + } - // determine if the constructor contains eager properties. if it - // does, then the constructor is eager + return $objectToObjectMetadata; + } - $constructorIsEager = false; + /** + * @param class-string $targetClass + * @param list $eagerProperties + * @param list $constructorPropertyMappings + * @return array{array,bool} + */ + private function getProxyParameters( + string $targetClass, + array $eagerProperties, + array $constructorPropertyMappings, + ): array { + // ensure we can create the proxy - foreach ($objectToObjectMetadata->getConstructorPropertyMappings() as $propertyMapping) { - if (!$propertyMapping->isSourceLazy()) { - $constructorIsEager = true; - break; - } - } + $this->proxyFactory + ->createProxy($targetClass, function ($instance): void {}, $eagerProperties); - // if the constructor is eager, then every constructor argument is - // eager + // determine if the constructor contains eager properties. if it + // does, then the constructor is eager - if ($constructorIsEager) { - foreach ($objectToObjectMetadata->getConstructorPropertyMappings() as $propertyMapping) { - $eagerProperties[] = $propertyMapping->getTargetProperty(); - } + $constructorIsEager = false; - $eagerProperties = array_unique($eagerProperties); + foreach ($constructorPropertyMappings as $propertyMapping) { + if (!$propertyMapping->isSourceLazy()) { + $constructorIsEager = true; + break; } + } - // skipped properties is the argument used by createLazyGhost() + // if the constructor is eager, then every constructor argument is + // eager - $skippedProperties = ClassUtil::getSkippedProperties( - $targetClass, - $eagerProperties, - ); + if ($constructorIsEager) { + foreach ($constructorPropertyMappings as $propertyMapping) { + $eagerProperties[] = $propertyMapping->getTargetProperty(); + } - $objectToObjectMetadata = $objectToObjectMetadata->withTargetProxy( - $skippedProperties, - $constructorIsEager, - ); - } catch (ProxyNotSupportedException $e) { - $objectToObjectMetadata = $objectToObjectMetadata - ->withReasonCannotUseProxy($e->getReason()); + $eagerProperties = array_unique($eagerProperties); } - return $objectToObjectMetadata; + // skipped properties is the argument used by createLazyGhost() + + $skippedProperties = ClassUtil::getSkippedProperties( + $targetClass, + $eagerProperties, + ); + + return [$skippedProperties, $constructorIsEager]; } /** diff --git a/src/Transformer/ObjectToObjectMetadata/ObjectToObjectMetadata.php b/src/Transformer/ObjectToObjectMetadata/ObjectToObjectMetadata.php index 8c98db5a..d7c0f2a1 100644 --- a/src/Transformer/ObjectToObjectMetadata/ObjectToObjectMetadata.php +++ b/src/Transformer/ObjectToObjectMetadata/ObjectToObjectMetadata.php @@ -22,27 +22,27 @@ final readonly class ObjectToObjectMetadata { /** - * @var array + * @var list */ private array $allPropertyMappings; /** - * @var array + * @var list */ private array $propertyMappings; /** - * @var array + * @var list */ private array $constructorPropertyMappings; /** - * @var array + * @var list */ private array $lazyPropertyMappings; /** - * @var array + * @var list */ private array $eagerPropertyMappings; @@ -50,9 +50,9 @@ * @param class-string $sourceClass * @param class-string $targetClass Effective target class after resolving inheritance map * @param class-string $providedTargetClass - * @param array $allPropertyMappings + * @param list $allPropertyMappings * @param array $targetProxySkippedProperties - * @param array $sourceProperties List of the source properties. Used by `ObjectToObjectTransformer` to determine if a property is a dynamic property. A property not listed here is considered dynamic. + * @param list $sourceProperties List of the source properties. Used by `ObjectToObjectTransformer` to determine if a property is a dynamic property. A property not listed here is considered dynamic. */ public function __construct( private string $sourceClass, @@ -182,7 +182,7 @@ public function isCloneable(): bool } /** - * @return array + * @return list */ public function getPropertyMappings(): array { @@ -190,7 +190,7 @@ public function getPropertyMappings(): array } /** - * @return array + * @return list */ public function getLazyPropertyMappings(): array { @@ -198,7 +198,7 @@ public function getLazyPropertyMappings(): array } /** - * @return array + * @return list */ public function getEagerPropertyMappings(): array { @@ -206,7 +206,7 @@ public function getEagerPropertyMappings(): array } /** - * @return array + * @return list */ public function getConstructorPropertyMappings(): array { @@ -214,7 +214,7 @@ public function getConstructorPropertyMappings(): array } /** - * @return array + * @return list */ public function getAllPropertyMappings(): array { @@ -288,7 +288,7 @@ public function targetAllowsDynamicProperties(): bool } /** - * @return array + * @return list */ public function getSourceProperties(): array {