From 18a9f2e172502f02a68fc35ed9e21faa636b1cd4 Mon Sep 17 00:00:00 2001 From: Joel Wurtz Date: Sat, 9 Mar 2024 10:47:02 +0100 Subject: [PATCH] fix(transformer): change the way transformer factory are injected to make it work as soon as automapper is created --- src/AutoMapper.php | 39 +++--- src/AutoMapperRegistryAwareInterface.php | 17 +++ src/AutoMapperRegistryAwareTrait.php | 20 +++ src/Transformer/ArrayTransformerFactory.php | 7 +- src/Transformer/ChainTransformerFactory.php | 118 +++++++++++++----- .../ChainTransformerFactoryAwareInterface.php | 15 +++ .../ChainTransformerFactoryAwareTrait.php | 15 +++ .../MultipleTransformerFactory.php | 7 +- .../NullableTransformerFactory.php | 7 +- src/Transformer/ObjectTransformerFactory.php | 12 +- .../UniqueTypeTransformerFactory.php | 7 +- .../FromSourceMappingExtractorTest.php | 20 +-- .../FromTargetMappingExtractorTest.php | 20 +-- tests/MapperGeneratorMetadataFactoryTest.php | 20 +-- .../ArrayTransformerFactoryTest.php | 12 +- .../MultipleTransformerFactoryTest.php | 9 +- .../ObjectTransformerFactoryTest.php | 3 +- 17 files changed, 239 insertions(+), 109 deletions(-) create mode 100644 src/AutoMapperRegistryAwareInterface.php create mode 100644 src/AutoMapperRegistryAwareTrait.php create mode 100644 src/Transformer/ChainTransformerFactoryAwareInterface.php create mode 100644 src/Transformer/ChainTransformerFactoryAwareTrait.php diff --git a/src/AutoMapper.php b/src/AutoMapper.php index f4c1bdd3..7116da86 100644 --- a/src/AutoMapper.php +++ b/src/AutoMapper.php @@ -64,6 +64,7 @@ public function __construct( public readonly CustomTransformersRegistry $customTransformersRegistry, private readonly ?MapperGeneratorMetadataFactoryInterface $mapperConfigurationFactory = null, ) { + $this->chainTransformerFactory->setAutoMapperRegistry($this); } public function register(MapperGeneratorMetadataInterface $configuration): void @@ -149,8 +150,13 @@ public function getMetadata(string $source, string $target): ?MapperGeneratorMet return $this->metadata[$source][$target]; } + /** + * @deprecated since 8.2, will be removed in 9.0. + */ public function bindTransformerFactory(TransformerFactoryInterface $transformerFactory): void { + trigger_deprecation('jolicode/automapper', '8.2', 'The "%s()" method will be removed in version 9.0, transformer must be injected in the chain transformer factory constructor instead.', __METHOD__); + if (!$this->chainTransformerFactory->hasTransformerFactory($transformerFactory)) { $this->chainTransformerFactory->addTransformerFactory($transformerFactory); } @@ -202,7 +208,24 @@ public static function create( $customTransformerRegistry = new CustomTransformersRegistry(); - $transformerFactory = new ChainTransformerFactory(); + $factories = [ + new MultipleTransformerFactory(), + new NullableTransformerFactory(), + new UniqueTypeTransformerFactory(), + new DateTimeTransformerFactory(), + new BuiltinTransformerFactory(), + new ArrayTransformerFactory(), + new ObjectTransformerFactory(), + new EnumTransformerFactory(), + new CustomTransformerFactory($customTransformerRegistry), + ]; + + if (class_exists(AbstractUid::class)) { + $factories[] = new SymfonyUidTransformerFactory(); + } + + $transformerFactory = new ChainTransformerFactory($factories); + $sourceTargetMappingExtractor = new SourceTargetMappingExtractor( $propertyInfoExtractor, new MapToContextPropertyInfoExtractorDecorator($reflectionExtractor), @@ -244,20 +267,6 @@ public static function create( ), ) : new self($loader, $transformerFactory, $customTransformerRegistry); - $transformerFactory->addTransformerFactory(new MultipleTransformerFactory($transformerFactory)); - $transformerFactory->addTransformerFactory(new NullableTransformerFactory($transformerFactory)); - $transformerFactory->addTransformerFactory(new UniqueTypeTransformerFactory($transformerFactory)); - $transformerFactory->addTransformerFactory(new DateTimeTransformerFactory()); - $transformerFactory->addTransformerFactory(new BuiltinTransformerFactory()); - $transformerFactory->addTransformerFactory(new ArrayTransformerFactory($transformerFactory)); - $transformerFactory->addTransformerFactory(new ObjectTransformerFactory($autoMapper)); - $transformerFactory->addTransformerFactory(new EnumTransformerFactory()); - $transformerFactory->addTransformerFactory(new CustomTransformerFactory($customTransformerRegistry)); - - if (class_exists(AbstractUid::class)) { - $transformerFactory->addTransformerFactory(new SymfonyUidTransformerFactory()); - } - return $autoMapper; } } diff --git a/src/AutoMapperRegistryAwareInterface.php b/src/AutoMapperRegistryAwareInterface.php new file mode 100644 index 00000000..d68137b6 --- /dev/null +++ b/src/AutoMapperRegistryAwareInterface.php @@ -0,0 +1,17 @@ + + * + * @internal + */ +interface AutoMapperRegistryAwareInterface +{ + public function setAutoMapperRegistry(AutoMapperRegistryInterface $autoMapperRegistry): void; +} diff --git a/src/AutoMapperRegistryAwareTrait.php b/src/AutoMapperRegistryAwareTrait.php new file mode 100644 index 00000000..cf9fc255 --- /dev/null +++ b/src/AutoMapperRegistryAwareTrait.php @@ -0,0 +1,20 @@ +autoMapperRegistry = $autoMapperRegistry; + } +} diff --git a/src/Transformer/ArrayTransformerFactory.php b/src/Transformer/ArrayTransformerFactory.php index 78ccdd6a..8b059581 100644 --- a/src/Transformer/ArrayTransformerFactory.php +++ b/src/Transformer/ArrayTransformerFactory.php @@ -12,12 +12,9 @@ * * @author Joel Wurtz */ -final class ArrayTransformerFactory extends AbstractUniqueTypeTransformerFactory implements PrioritizedTransformerFactoryInterface +final class ArrayTransformerFactory extends AbstractUniqueTypeTransformerFactory implements PrioritizedTransformerFactoryInterface, ChainTransformerFactoryAwareInterface { - public function __construct( - private readonly ChainTransformerFactory $chainTransformerFactory, - ) { - } + use ChainTransformerFactoryAwareTrait; protected function createTransformer(Type $sourceType, Type $targetType, MapperMetadataInterface $mapperMetadata): ?TransformerInterface { diff --git a/src/Transformer/ChainTransformerFactory.php b/src/Transformer/ChainTransformerFactory.php index a387a4ed..1bf49292 100644 --- a/src/Transformer/ChainTransformerFactory.php +++ b/src/Transformer/ChainTransformerFactory.php @@ -4,43 +4,107 @@ namespace AutoMapper\Transformer; +use AutoMapper\AutoMapperRegistryAwareInterface; +use AutoMapper\AutoMapperRegistryInterface; use AutoMapper\MapperMetadataInterface; /** * @author Joel Wurtz */ -final class ChainTransformerFactory implements TransformerPropertyFactoryInterface, TransformerFactoryInterface +final class ChainTransformerFactory implements TransformerPropertyFactoryInterface, TransformerFactoryInterface, AutoMapperRegistryAwareInterface { - /** @var array> */ - private array $factories = []; + protected ?AutoMapperRegistryInterface $autoMapperRegistry = null; - /** @var list|null */ - private ?array $sorted = null; + /** + * @param array $factories + */ + public function __construct(private array $factories = []) + { + foreach ($this->factories as $factory) { + if ($factory instanceof ChainTransformerFactoryAwareInterface) { + $factory->setChainTransformerFactory($this); + } + } + + $this->sortFactories(); + } + + public function setAutoMapperRegistry(AutoMapperRegistryInterface $autoMapperRegistry): void + { + $this->autoMapperRegistry = $autoMapperRegistry; + + foreach ($this->factories as $factory) { + if ($factory instanceof AutoMapperRegistryAwareInterface) { + $factory->setAutoMapperRegistry($autoMapperRegistry); + } + } + } /** * Biggest priority is MultipleTransformerFactory with 128, so default priority will be bigger in order to * be used before it, 256 should be enough. + * + * @deprecated since 8.2, will be removed in 9.0. Pass the factory into the constructor instead */ public function addTransformerFactory(TransformerFactoryInterface|TransformerPropertyFactoryInterface $transformerFactory, int $priority = 256): void { - $this->sorted = null; + trigger_deprecation('jolicode/automapper', '8.2', 'The "%s()" method will be removed in version 9.0, transformer must be injected in the constructor instead.', __METHOD__); + + if ($transformerFactory instanceof AutoMapperRegistryAwareInterface && null !== $this->autoMapperRegistry) { + $transformerFactory->setAutoMapperRegistry($this->autoMapperRegistry); + } - if ($transformerFactory instanceof PrioritizedTransformerFactoryInterface) { - $priority = $transformerFactory->getPriority(); + if ($transformerFactory instanceof ChainTransformerFactoryAwareInterface) { + $transformerFactory->setChainTransformerFactory($this); } - if (!\array_key_exists($priority, $this->factories)) { - $this->factories[$priority] = []; + if (!$transformerFactory instanceof PrioritizedTransformerFactoryInterface) { + /** @var TransformerFactoryInterface|TransformerPropertyFactoryInterface $transformerFactory */ + $transformerFactory = new class($transformerFactory, $priority) implements TransformerFactoryInterface, TransformerPropertyFactoryInterface, PrioritizedTransformerFactoryInterface { + public function __construct(private readonly TransformerFactoryInterface|TransformerPropertyFactoryInterface $transformerFactory, private readonly int $priority) + { + } + + public function getTransformer(?array $sourceTypes, ?array $targetTypes, MapperMetadataInterface $mapperMetadata): ?TransformerInterface + { + if ($this->transformerFactory instanceof TransformerFactoryInterface) { + return $this->transformerFactory->getTransformer($sourceTypes, $targetTypes, $mapperMetadata); + } + + return null; + } + + public function getPropertyTransformer(?array $sourceTypes, ?array $targetTypes, MapperMetadataInterface $mapperMetadata, string $property): ?TransformerInterface + { + if ($this->transformerFactory instanceof TransformerPropertyFactoryInterface) { + return $this->transformerFactory->getPropertyTransformer($sourceTypes, $targetTypes, $mapperMetadata, $property); + } + + return $this->transformerFactory->getTransformer($sourceTypes, $targetTypes, $mapperMetadata); + } + + public function getPriority(): int + { + return $this->priority; + } + }; } - $this->factories[$priority][] = $transformerFactory; + + $this->factories[] = $transformerFactory; + $this->sortFactories(); } + /** + * @deprecated since 8.2, will be removed in 9.0. + */ public function hasTransformerFactory(TransformerFactoryInterface $transformerFactory): bool { + trigger_deprecation('jolicode/automapper', '8.2', 'The "%s()" method will be removed in version 9.0, transformer must be injected in the constructor instead.', __METHOD__); + $this->sortFactories(); $transformerFactoryClass = $transformerFactory::class; - foreach ($this->sorted ?? [] as $factory) { + foreach ($this->factories as $factory) { if (is_a($factory, $transformerFactoryClass)) { return true; } @@ -51,9 +115,7 @@ public function hasTransformerFactory(TransformerFactoryInterface $transformerFa public function getPropertyTransformer(?array $sourceTypes, ?array $targetTypes, MapperMetadataInterface $mapperMetadata, string $property): ?TransformerInterface { - $this->sortFactories(); - - foreach ($this->sorted ?? [] as $factory) { + foreach ($this->factories as $factory) { if ($factory instanceof TransformerPropertyFactoryInterface) { $transformer = $factory->getPropertyTransformer($sourceTypes, $targetTypes, $mapperMetadata, $property); } else { @@ -70,17 +132,13 @@ public function getPropertyTransformer(?array $sourceTypes, ?array $targetTypes, public function getTransformer(?array $sourceTypes, ?array $targetTypes, MapperMetadataInterface $mapperMetadata): ?TransformerInterface { - $this->sortFactories(); - - foreach ($this->sorted ?? [] as $factory) { - $transformer = null; - + foreach ($this->factories as $factory) { if ($factory instanceof TransformerFactoryInterface) { $transformer = $factory->getTransformer($sourceTypes, $targetTypes, $mapperMetadata); - } - if (null !== $transformer) { - return $transformer; + if (null !== $transformer) { + return $transformer; + } } } @@ -89,15 +147,11 @@ public function getTransformer(?array $sourceTypes, ?array $targetTypes, MapperM private function sortFactories(): void { - if (null === $this->sorted) { - $this->sorted = []; - krsort($this->factories); + usort($this->factories, static function (TransformerPropertyFactoryInterface|TransformerFactoryInterface $a, TransformerPropertyFactoryInterface|TransformerFactoryInterface $b) { + $aPriority = $a instanceof PrioritizedTransformerFactoryInterface ? $a->getPriority() : 256; + $bPriority = $b instanceof PrioritizedTransformerFactoryInterface ? $b->getPriority() : 256; - foreach ($this->factories as $prioritisedFactories) { - foreach ($prioritisedFactories as $factory) { - $this->sorted[] = $factory; - } - } - } + return $bPriority <=> $aPriority; + }); } } diff --git a/src/Transformer/ChainTransformerFactoryAwareInterface.php b/src/Transformer/ChainTransformerFactoryAwareInterface.php new file mode 100644 index 00000000..5d0f4f90 --- /dev/null +++ b/src/Transformer/ChainTransformerFactoryAwareInterface.php @@ -0,0 +1,15 @@ + + */ +interface ChainTransformerFactoryAwareInterface +{ + public function setChainTransformerFactory(ChainTransformerFactory $chainTransformerFactory): void; +} diff --git a/src/Transformer/ChainTransformerFactoryAwareTrait.php b/src/Transformer/ChainTransformerFactoryAwareTrait.php new file mode 100644 index 00000000..6529bf4a --- /dev/null +++ b/src/Transformer/ChainTransformerFactoryAwareTrait.php @@ -0,0 +1,15 @@ +chainTransformerFactory = $chainTransformerFactory; + } +} diff --git a/src/Transformer/MultipleTransformerFactory.php b/src/Transformer/MultipleTransformerFactory.php index 3e9fccb3..c0f330db 100644 --- a/src/Transformer/MultipleTransformerFactory.php +++ b/src/Transformer/MultipleTransformerFactory.php @@ -9,12 +9,9 @@ /** * @author Joel Wurtz */ -final readonly class MultipleTransformerFactory implements TransformerFactoryInterface, PrioritizedTransformerFactoryInterface +final class MultipleTransformerFactory implements TransformerFactoryInterface, PrioritizedTransformerFactoryInterface, ChainTransformerFactoryAwareInterface { - public function __construct( - private ChainTransformerFactory $chainTransformerFactory, - ) { - } + use ChainTransformerFactoryAwareTrait; public function getTransformer(?array $sourceTypes, ?array $targetTypes, MapperMetadataInterface $mapperMetadata): ?TransformerInterface { diff --git a/src/Transformer/NullableTransformerFactory.php b/src/Transformer/NullableTransformerFactory.php index ee492e37..11bc1bc6 100644 --- a/src/Transformer/NullableTransformerFactory.php +++ b/src/Transformer/NullableTransformerFactory.php @@ -10,12 +10,9 @@ /** * @author Joel Wurtz */ -final readonly class NullableTransformerFactory implements TransformerFactoryInterface, PrioritizedTransformerFactoryInterface +final class NullableTransformerFactory implements TransformerFactoryInterface, PrioritizedTransformerFactoryInterface, ChainTransformerFactoryAwareInterface { - public function __construct( - private ChainTransformerFactory $chainTransformerFactory, - ) { - } + use ChainTransformerFactoryAwareTrait; public function getTransformer(?array $sourceTypes, ?array $targetTypes, MapperMetadataInterface $mapperMetadata): ?TransformerInterface { diff --git a/src/Transformer/ObjectTransformerFactory.php b/src/Transformer/ObjectTransformerFactory.php index 9cd7a7ae..54c1a969 100644 --- a/src/Transformer/ObjectTransformerFactory.php +++ b/src/Transformer/ObjectTransformerFactory.php @@ -4,19 +4,17 @@ namespace AutoMapper\Transformer; -use AutoMapper\AutoMapperRegistryInterface; +use AutoMapper\AutoMapperRegistryAwareInterface; +use AutoMapper\AutoMapperRegistryAwareTrait; use AutoMapper\MapperMetadataInterface; use Symfony\Component\PropertyInfo\Type; /** * @author Joel Wurtz */ -final class ObjectTransformerFactory extends AbstractUniqueTypeTransformerFactory implements PrioritizedTransformerFactoryInterface +final class ObjectTransformerFactory extends AbstractUniqueTypeTransformerFactory implements PrioritizedTransformerFactoryInterface, AutoMapperRegistryAwareInterface { - public function __construct( - private readonly AutoMapperRegistryInterface $autoMapper, - ) { - } + use AutoMapperRegistryAwareTrait; protected function createTransformer(Type $sourceType, Type $targetType, MapperMetadataInterface $mapperMetadata): ?TransformerInterface { @@ -36,7 +34,7 @@ protected function createTransformer(Type $sourceType, Type $targetType, MapperM $targetTypeName = $targetType->getClassName(); } - if (null !== $sourceTypeName && null !== $targetTypeName && $this->autoMapper->hasMapper($sourceTypeName, $targetTypeName)) { + if (null !== $sourceTypeName && null !== $targetTypeName && $this->autoMapperRegistry->hasMapper($sourceTypeName, $targetTypeName)) { return new ObjectTransformer($sourceType, $targetType); } diff --git a/src/Transformer/UniqueTypeTransformerFactory.php b/src/Transformer/UniqueTypeTransformerFactory.php index efc3431f..30287d20 100644 --- a/src/Transformer/UniqueTypeTransformerFactory.php +++ b/src/Transformer/UniqueTypeTransformerFactory.php @@ -11,12 +11,9 @@ * * @author Joel Wurtz */ -final readonly class UniqueTypeTransformerFactory implements TransformerFactoryInterface, PrioritizedTransformerFactoryInterface +final class UniqueTypeTransformerFactory implements TransformerFactoryInterface, PrioritizedTransformerFactoryInterface, ChainTransformerFactoryAwareInterface { - public function __construct( - private ChainTransformerFactory $chainTransformerFactory, - ) { - } + use ChainTransformerFactoryAwareTrait; public function getTransformer(?array $sourceTypes, ?array $targetTypes, MapperMetadataInterface $mapperMetadata): ?TransformerInterface { diff --git a/tests/Extractor/FromSourceMappingExtractorTest.php b/tests/Extractor/FromSourceMappingExtractorTest.php index 3b274018..8b432209 100644 --- a/tests/Extractor/FromSourceMappingExtractorTest.php +++ b/tests/Extractor/FromSourceMappingExtractorTest.php @@ -47,7 +47,17 @@ private function fromSourceMappingExtractorBootstrap(bool $private = true): void } $reflectionExtractor = new ReflectionExtractor(null, null, null, true, $flags); - $transformerFactory = new ChainTransformerFactory(); + + $transformerFactory = new ChainTransformerFactory([ + new MultipleTransformerFactory(), + new NullableTransformerFactory(), + new UniqueTypeTransformerFactory(), + new DateTimeTransformerFactory(), + new BuiltinTransformerFactory(), + new ArrayTransformerFactory(), + new ObjectTransformerFactory(), + ]); + $transformerFactory->setAutoMapperRegistry($this->autoMapper); $phpStanExtractor = new PhpStanExtractor(); $propertyInfoExtractor = new PropertyInfoExtractor( @@ -64,14 +74,6 @@ private function fromSourceMappingExtractorBootstrap(bool $private = true): void $transformerFactory, $classMetadataFactory ); - - $transformerFactory->addTransformerFactory(new MultipleTransformerFactory($transformerFactory)); - $transformerFactory->addTransformerFactory(new NullableTransformerFactory($transformerFactory)); - $transformerFactory->addTransformerFactory(new UniqueTypeTransformerFactory($transformerFactory)); - $transformerFactory->addTransformerFactory(new DateTimeTransformerFactory()); - $transformerFactory->addTransformerFactory(new BuiltinTransformerFactory()); - $transformerFactory->addTransformerFactory(new ArrayTransformerFactory($transformerFactory)); - $transformerFactory->addTransformerFactory(new ObjectTransformerFactory($this->autoMapper)); } public function testWithTargetAsArray(): void diff --git a/tests/Extractor/FromTargetMappingExtractorTest.php b/tests/Extractor/FromTargetMappingExtractorTest.php index 1295b3c9..c1b22403 100644 --- a/tests/Extractor/FromTargetMappingExtractorTest.php +++ b/tests/Extractor/FromTargetMappingExtractorTest.php @@ -55,7 +55,17 @@ private function fromTargetMappingExtractorBootstrap(bool $private = true): void [$reflectionExtractor] ); - $transformerFactory = new ChainTransformerFactory(); + $transformerFactory = new ChainTransformerFactory([ + new MultipleTransformerFactory(), + new NullableTransformerFactory(), + new UniqueTypeTransformerFactory(), + new DateTimeTransformerFactory(), + new BuiltinTransformerFactory(), + new ArrayTransformerFactory(), + new ObjectTransformerFactory(), + ]); + + $transformerFactory->setAutoMapperRegistry($this->autoMapper); $this->fromTargetMappingExtractor = new FromTargetMappingExtractor( $propertyInfoExtractor, @@ -64,14 +74,6 @@ private function fromTargetMappingExtractorBootstrap(bool $private = true): void $transformerFactory, $classMetadataFactory ); - - $transformerFactory->addTransformerFactory(new MultipleTransformerFactory($transformerFactory)); - $transformerFactory->addTransformerFactory(new NullableTransformerFactory($transformerFactory)); - $transformerFactory->addTransformerFactory(new UniqueTypeTransformerFactory($transformerFactory)); - $transformerFactory->addTransformerFactory(new DateTimeTransformerFactory()); - $transformerFactory->addTransformerFactory(new BuiltinTransformerFactory()); - $transformerFactory->addTransformerFactory(new ArrayTransformerFactory($transformerFactory)); - $transformerFactory->addTransformerFactory(new ObjectTransformerFactory($this->autoMapper)); } public function testWithSourceAsArray(): void diff --git a/tests/MapperGeneratorMetadataFactoryTest.php b/tests/MapperGeneratorMetadataFactoryTest.php index abfdb388..2c9d3fd6 100644 --- a/tests/MapperGeneratorMetadataFactoryTest.php +++ b/tests/MapperGeneratorMetadataFactoryTest.php @@ -46,7 +46,17 @@ protected function setUp(): void [$reflectionExtractor] ); - $transformerFactory = new ChainTransformerFactory(); + $transformerFactory = new ChainTransformerFactory([ + new MultipleTransformerFactory(), + new NullableTransformerFactory(), + new UniqueTypeTransformerFactory(), + new DateTimeTransformerFactory(), + new BuiltinTransformerFactory(), + new ArrayTransformerFactory(), + new ObjectTransformerFactory(), + ]); + $transformerFactory->setAutoMapperRegistry($this->autoMapper); + $sourceTargetMappingExtractor = new SourceTargetMappingExtractor( $propertyInfoExtractor, $reflectionExtractor, @@ -76,14 +86,6 @@ protected function setUp(): void $fromSourceMappingExtractor, $fromTargetMappingExtractor ); - - $transformerFactory->addTransformerFactory(new MultipleTransformerFactory($transformerFactory)); - $transformerFactory->addTransformerFactory(new NullableTransformerFactory($transformerFactory)); - $transformerFactory->addTransformerFactory(new UniqueTypeTransformerFactory($transformerFactory)); - $transformerFactory->addTransformerFactory(new DateTimeTransformerFactory()); - $transformerFactory->addTransformerFactory(new BuiltinTransformerFactory()); - $transformerFactory->addTransformerFactory(new ArrayTransformerFactory($transformerFactory)); - $transformerFactory->addTransformerFactory(new ObjectTransformerFactory($this->autoMapper)); } public function testCreateObjectToArray(): void diff --git a/tests/Transformer/ArrayTransformerFactoryTest.php b/tests/Transformer/ArrayTransformerFactoryTest.php index d4edfe88..bfa2624b 100644 --- a/tests/Transformer/ArrayTransformerFactoryTest.php +++ b/tests/Transformer/ArrayTransformerFactoryTest.php @@ -16,7 +16,8 @@ class ArrayTransformerFactoryTest extends TestCase public function testGetTransformer(): void { $chainFactory = new ChainTransformerFactory(); - $factory = new ArrayTransformerFactory($chainFactory); + $factory = new ArrayTransformerFactory(); + $factory->setChainTransformerFactory($chainFactory); $mapperMetadata = $this->getMockBuilder(MapperMetadata::class)->disableOriginalConstructor()->getMock(); $transformer = $factory->getTransformer([new Type('array', false, null, true)], [new Type('array', false, null, true)], $mapperMetadata); @@ -27,7 +28,8 @@ public function testGetTransformer(): void public function testNoTransformerTargetNoCollection(): void { $chainFactory = new ChainTransformerFactory(); - $factory = new ArrayTransformerFactory($chainFactory); + $factory = new ArrayTransformerFactory(); + $factory->setChainTransformerFactory($chainFactory); $mapperMetadata = $this->getMockBuilder(MapperMetadata::class)->disableOriginalConstructor()->getMock(); $transformer = $factory->getTransformer([new Type('array', false, null, true)], [new Type('string')], $mapperMetadata); @@ -38,7 +40,8 @@ public function testNoTransformerTargetNoCollection(): void public function testNoTransformerSourceNoCollection(): void { $chainFactory = new ChainTransformerFactory(); - $factory = new ArrayTransformerFactory($chainFactory); + $factory = new ArrayTransformerFactory(); + $factory->setChainTransformerFactory($chainFactory); $mapperMetadata = $this->getMockBuilder(MapperMetadata::class)->disableOriginalConstructor()->getMock(); $transformer = $factory->getTransformer([new Type('string')], [new Type('array', false, null, true)], $mapperMetadata); @@ -49,7 +52,8 @@ public function testNoTransformerSourceNoCollection(): void public function testNoTransformerIfNoSubTypeTransformerNoCollection(): void { $chainFactory = new ChainTransformerFactory(); - $factory = new ArrayTransformerFactory($chainFactory); + $factory = new ArrayTransformerFactory(); + $factory->setChainTransformerFactory($chainFactory); $mapperMetadata = $this->getMockBuilder(MapperMetadata::class)->disableOriginalConstructor()->getMock(); $stringType = new Type('string'); diff --git a/tests/Transformer/MultipleTransformerFactoryTest.php b/tests/Transformer/MultipleTransformerFactoryTest.php index 9160534b..22363783 100644 --- a/tests/Transformer/MultipleTransformerFactoryTest.php +++ b/tests/Transformer/MultipleTransformerFactoryTest.php @@ -18,7 +18,8 @@ class MultipleTransformerFactoryTest extends TestCase public function testGetTransformer(): void { $chainFactory = new ChainTransformerFactory(); - $factory = new MultipleTransformerFactory($chainFactory); + $factory = new MultipleTransformerFactory(); + $factory->setChainTransformerFactory($chainFactory); $chainFactory->addTransformerFactory($factory); $chainFactory->addTransformerFactory(new BuiltinTransformerFactory()); @@ -39,7 +40,8 @@ public function testGetTransformer(): void public function testNoTransformerIfNoSubTransformer(): void { $chainFactory = new ChainTransformerFactory(); - $factory = new MultipleTransformerFactory($chainFactory); + $factory = new MultipleTransformerFactory(); + $factory->setChainTransformerFactory($chainFactory); $mapperMetadata = $this->getMockBuilder(MapperMetadata::class)->disableOriginalConstructor()->getMock(); @@ -51,7 +53,8 @@ public function testNoTransformerIfNoSubTransformer(): void public function testNoTransformer(): void { $chainFactory = new ChainTransformerFactory(); - $factory = new MultipleTransformerFactory($chainFactory); + $factory = new MultipleTransformerFactory(); + $factory->setChainTransformerFactory($chainFactory); $chainFactory->addTransformerFactory($factory); $chainFactory->addTransformerFactory(new BuiltinTransformerFactory()); diff --git a/tests/Transformer/ObjectTransformerFactoryTest.php b/tests/Transformer/ObjectTransformerFactoryTest.php index 8a1852c7..9e012786 100644 --- a/tests/Transformer/ObjectTransformerFactoryTest.php +++ b/tests/Transformer/ObjectTransformerFactoryTest.php @@ -17,7 +17,8 @@ public function testGetTransformer(): void { $autoMapperRegistry = $this->getMockBuilder(AutoMapperRegistryInterface::class)->getMock(); $mapperMetadata = $this->getMockBuilder(MapperMetadata::class)->disableOriginalConstructor()->getMock(); - $factory = new ObjectTransformerFactory($autoMapperRegistry); + $factory = new ObjectTransformerFactory(); + $factory->setAutoMapperRegistry($autoMapperRegistry); $autoMapperRegistry ->expects($this->any())