From a9768d6919ef8c09437c224e9a1906ab89cd4e2b Mon Sep 17 00:00:00 2001 From: Priyadi Iman Nurcahyo <1102197+priyadi@users.noreply.github.com> Date: Wed, 1 May 2024 21:52:04 +0700 Subject: [PATCH] add remover metadata & fix remover --- src/Transformer/Model/AdderRemoverProxy.php | 14 ++++++++------ .../ObjectToObjectMetadataFactory.php | 12 ++++++++++++ .../ObjectToObjectMetadata/PropertyMapping.php | 12 ++++++++++++ src/Transformer/Util/ReaderWriter.php | 9 ++++++++- 4 files changed, 40 insertions(+), 7 deletions(-) diff --git a/src/Transformer/Model/AdderRemoverProxy.php b/src/Transformer/Model/AdderRemoverProxy.php index 0ab8314..1d0faeb 100644 --- a/src/Transformer/Model/AdderRemoverProxy.php +++ b/src/Transformer/Model/AdderRemoverProxy.php @@ -38,7 +38,7 @@ public function __construct( /** * @return \ArrayAccess|array */ - private function getValue(): mixed + private function getCollection(): mixed { if ($this->getterMethodName === null) { throw new LogicException('Getter method is not available'); @@ -58,7 +58,7 @@ private function getValue(): mixed public function getIterator(): \Traversable { - $value = $this->getValue(); + $value = $this->getCollection(); if ($value instanceof \Traversable) { return $value; @@ -71,13 +71,13 @@ public function getIterator(): \Traversable public function offsetExists(mixed $offset): bool { - return isset($this->getValue()[$offset]); + return isset($this->getCollection()[$offset]); } /** @psalm-suppress MixedInferredReturnType */ public function offsetGet(mixed $offset): mixed { - return $this->getValue()[$offset]; + return $this->getCollection()[$offset]; } public function offsetSet(mixed $offset, mixed $value): void @@ -96,13 +96,15 @@ public function offsetUnset(mixed $offset): void throw new LogicException('Remover method is not available'); } + $value = $this->getCollection()[$offset]; + /** @psalm-suppress MixedMethodCall */ - $this->hostObject->{$this->removerMethodName}($offset); + $this->hostObject->{$this->removerMethodName}($value); } public function count(): int { - $value = $this->getValue(); + $value = $this->getCollection(); if ($value instanceof \Countable) { return $value->count(); diff --git a/src/Transformer/ObjectToObjectMetadata/Implementation/ObjectToObjectMetadataFactory.php b/src/Transformer/ObjectToObjectMetadata/Implementation/ObjectToObjectMetadataFactory.php index 2166501..7b0a99b 100644 --- a/src/Transformer/ObjectToObjectMetadata/Implementation/ObjectToObjectMetadataFactory.php +++ b/src/Transformer/ObjectToObjectMetadata/Implementation/ObjectToObjectMetadataFactory.php @@ -254,6 +254,9 @@ public function createObjectToObjectMetadata( // process target setter write mode + $targetRemoverWriteName = null; + $targetRemoverWriteVisibility = Visibility::None; + if ($targetSetterWriteInfo === null) { $targetSetterWriteMode = WriteMode::None; $targetSetterWriteName = null; @@ -261,12 +264,19 @@ public function createObjectToObjectMetadata( } elseif ($targetSetterWriteInfo->getType() === PropertyWriteInfo::TYPE_ADDER_AND_REMOVER) { $targetSetterWriteMode = WriteMode::AdderRemover; $targetSetterWriteName = $targetSetterWriteInfo->getAdderInfo()->getName(); + $targetRemoverWriteName = $targetSetterWriteInfo->getRemoverInfo()->getName(); $targetSetterWriteVisibility = match ($targetSetterWriteInfo->getAdderInfo()->getVisibility()) { PropertyWriteInfo::VISIBILITY_PUBLIC => Visibility::Public, PropertyWriteInfo::VISIBILITY_PROTECTED => Visibility::Protected, PropertyWriteInfo::VISIBILITY_PRIVATE => Visibility::Private, default => Visibility::None, }; + $targetRemoverWriteVisibility = match ($targetSetterWriteInfo->getRemoverInfo()->getVisibility()) { + PropertyWriteInfo::VISIBILITY_PUBLIC => Visibility::Public, + PropertyWriteInfo::VISIBILITY_PROTECTED => Visibility::Protected, + PropertyWriteInfo::VISIBILITY_PRIVATE => Visibility::Private, + default => Visibility::None, + }; } else { $targetSetterWriteMode = match ($targetSetterWriteInfo->getType()) { PropertyWriteInfo::TYPE_METHOD => WriteMode::Method, @@ -376,7 +386,9 @@ public function createObjectToObjectMetadata( targetReadVisibility: $targetReadVisibility, targetSetterWriteMode: $targetSetterWriteMode, targetSetterWriteName: $targetSetterWriteName, + targetRemoverWriteName: $targetRemoverWriteName, targetSetterWriteVisibility: $targetSetterWriteVisibility, + targetRemoverWriteVisibility: $targetRemoverWriteVisibility, targetConstructorWriteMode: $targetConstructorWriteMode, targetConstructorWriteName: $targetConstructorWriteName, targetScalarType: $targetPropertyScalarType, diff --git a/src/Transformer/ObjectToObjectMetadata/PropertyMapping.php b/src/Transformer/ObjectToObjectMetadata/PropertyMapping.php index db917a4..65ff6fe 100644 --- a/src/Transformer/ObjectToObjectMetadata/PropertyMapping.php +++ b/src/Transformer/ObjectToObjectMetadata/PropertyMapping.php @@ -51,7 +51,9 @@ public function __construct( private Visibility $targetReadVisibility, private WriteMode $targetSetterWriteMode, private ?string $targetSetterWriteName, + private ?string $targetRemoverWriteName, private Visibility $targetSetterWriteVisibility, + private Visibility $targetRemoverWriteVisibility, private WriteMode $targetConstructorWriteMode, private ?string $targetConstructorWriteName, private ?string $targetScalarType, @@ -186,4 +188,14 @@ public function targetAllowsDelete(): bool { return $this->targetAllowsDelete; } + + public function getTargetRemoverWriteName(): ?string + { + return $this->targetRemoverWriteName; + } + + public function getTargetRemoverWriteVisibility(): Visibility + { + return $this->targetRemoverWriteVisibility; + } } diff --git a/src/Transformer/Util/ReaderWriter.php b/src/Transformer/Util/ReaderWriter.php index 86061ce..503d996 100644 --- a/src/Transformer/Util/ReaderWriter.php +++ b/src/Transformer/Util/ReaderWriter.php @@ -100,11 +100,18 @@ public function readTargetProperty( $propertyMapping->getTargetSetterWriteMode() === WriteMode::AdderRemover && $propertyMapping->getTargetSetterWriteVisibility() === Visibility::Public ) { + if ($propertyMapping->getTargetRemoverWriteVisibility() === Visibility::Public + ) { + $removerMethodName = $propertyMapping->getTargetRemoverWriteName(); + } else { + $removerMethodName = null; + } + return new AdderRemoverProxy( hostObject: $target, getterMethodName: $propertyMapping->getTargetReadName(), adderMethodName: $propertyMapping->getTargetSetterWriteName(), - removerMethodName: null + removerMethodName: $removerMethodName, ); }