From 131aadeabf43ea97cc5e0f22ed9d4200c7c49ed5 Mon Sep 17 00:00:00 2001 From: Priyadi Iman Nurcahyo <1102197+priyadi@users.noreply.github.com> Date: Fri, 21 Jun 2024 14:06:52 +0700 Subject: [PATCH] the fix --- .../Implementation/PropertyMapperResolver.php | 31 ++++++------------- 1 file changed, 10 insertions(+), 21 deletions(-) diff --git a/src/CustomMapper/Implementation/PropertyMapperResolver.php b/src/CustomMapper/Implementation/PropertyMapperResolver.php index 3fb70a5..f10bebd 100644 --- a/src/CustomMapper/Implementation/PropertyMapperResolver.php +++ b/src/CustomMapper/Implementation/PropertyMapperResolver.php @@ -15,9 +15,12 @@ use Rekalogika\Mapper\CustomMapper\PropertyMapperResolverInterface; use Rekalogika\Mapper\ServiceMethod\ServiceMethodSpecification; +use Rekalogika\Mapper\Util\ClassUtil; /** * @internal + * + * Not in hot path, no caching needed. */ final class PropertyMapperResolver implements PropertyMapperResolverInterface { @@ -52,28 +55,14 @@ public function getPropertyMapper( string $targetClass, string $property ): ?ServiceMethodSpecification { - if (!isset($this->propertyMappers[$targetClass][$property])) { - return null; - } - - $propertyMappers = $this->propertyMappers[$targetClass][$property]; - - $sourceClassReflection = new \ReflectionClass($sourceClass); - - do { - if (isset($propertyMappers[$sourceClassReflection->getName()])) { - return $propertyMappers[$sourceClassReflection->getName()]; - } - } while ($sourceClassReflection = $sourceClassReflection->getParentClass()); - - $interfaces = class_implements($sourceClass); - if ($interfaces === false) { - return null; - } + $sourceClasses = ClassUtil::getAllClassesFromObject($sourceClass); + $targetClasses = ClassUtil::getAllClassesFromObject($targetClass); - foreach ($interfaces as $interface) { - if (isset($propertyMappers[$interface])) { - return $propertyMappers[$interface]; + foreach ($sourceClasses as $sourceClass) { + foreach ($targetClasses as $targetClass) { + if (isset($this->propertyMappers[$targetClass][$property][$sourceClass])) { + return $this->propertyMappers[$targetClass][$property][$sourceClass]; + } } }