From 2da896ae63462004abb2b127774e78d7487a37b4 Mon Sep 17 00:00:00 2001 From: soyuka Date: Sat, 17 May 2025 11:13:48 +0200 Subject: [PATCH 1/3] [ObjectMapper] embed collection transformer --- .../Tests/Fixtures/TransformCollection/A.php | 13 ++++++ .../Tests/Fixtures/TransformCollection/B.php | 9 ++++ .../Tests/Fixtures/TransformCollection/C.php | 14 +++++++ .../Tests/Fixtures/TransformCollection/D.php | 10 +++++ .../ObjectMapper/Tests/ObjectMapperTest.php | 15 +++++++ .../ObjectMapper/Transform/MapCollection.php | 42 +++++++++++++++++++ 6 files changed, 103 insertions(+) create mode 100644 src/Symfony/Component/ObjectMapper/Tests/Fixtures/TransformCollection/A.php create mode 100644 src/Symfony/Component/ObjectMapper/Tests/Fixtures/TransformCollection/B.php create mode 100644 src/Symfony/Component/ObjectMapper/Tests/Fixtures/TransformCollection/C.php create mode 100644 src/Symfony/Component/ObjectMapper/Tests/Fixtures/TransformCollection/D.php create mode 100644 src/Symfony/Component/ObjectMapper/Transform/MapCollection.php diff --git a/src/Symfony/Component/ObjectMapper/Tests/Fixtures/TransformCollection/A.php b/src/Symfony/Component/ObjectMapper/Tests/Fixtures/TransformCollection/A.php new file mode 100644 index 0000000000000..e08f1b70b9909 --- /dev/null +++ b/src/Symfony/Component/ObjectMapper/Tests/Fixtures/TransformCollection/A.php @@ -0,0 +1,13 @@ +assertEquals($c->foo, 'donotmap'); $this->assertEquals($c->doesNotExistInTargetB, 'foo'); } + + public function testTransformCollection() + { + $u = new TransformCollectionA(); + $u->foo = [new TransformCollectionC('a'), new TransformCollectionC('b')]; + $mapper = new ObjectMapper(); + + $transformed = $mapper->map($u, TransformCollectionB::class); + + $this->assertEquals($transformed->foo, [new TransformCollectionD('a'), new TransformCollectionD('b')]); + } } diff --git a/src/Symfony/Component/ObjectMapper/Transform/MapCollection.php b/src/Symfony/Component/ObjectMapper/Transform/MapCollection.php new file mode 100644 index 0000000000000..ebbb2a70353a2 --- /dev/null +++ b/src/Symfony/Component/ObjectMapper/Transform/MapCollection.php @@ -0,0 +1,42 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\ObjectMapper\Transform; + +use Symfony\Component\ObjectMapper\Exception\MappingException; +use Symfony\Component\ObjectMapper\ObjectMapper; +use Symfony\Component\ObjectMapper\ObjectMapperInterface; +use Symfony\Component\ObjectMapper\TransformCallableInterface; + +/** + * @template T of object + * + * @implements TransformCallableInterface + */ +class MapCollection implements TransformCallableInterface +{ + public function __construct(private ?ObjectMapperInterface $objectMapper = new ObjectMapper()) + { + } + + public function __invoke(mixed $value, object $source, ?object $target): mixed + { + if (!is_iterable($value)) { + throw new MappingException(sprintf('The MapCollection transform expects an iterable, "%s" given.', get_debug_type($value))); + } + + foreach ($value as &$v) { + $v = $this->objectMapper->map($v); + } + + return $value; + } +} From c4c7b377c86db2233d0ab9e0006614b44ed595b4 Mon Sep 17 00:00:00 2001 From: Antoine Bluchet Date: Mon, 19 May 2025 15:18:47 +0200 Subject: [PATCH 2/3] Update src/Symfony/Component/ObjectMapper/Tests/ObjectMapperTest.php MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jérôme Tamarelle --- src/Symfony/Component/ObjectMapper/Tests/ObjectMapperTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Symfony/Component/ObjectMapper/Tests/ObjectMapperTest.php b/src/Symfony/Component/ObjectMapper/Tests/ObjectMapperTest.php index 0f56a2d8af86f..0758be0211bde 100644 --- a/src/Symfony/Component/ObjectMapper/Tests/ObjectMapperTest.php +++ b/src/Symfony/Component/ObjectMapper/Tests/ObjectMapperTest.php @@ -304,6 +304,6 @@ public function testTransformCollection() $transformed = $mapper->map($u, TransformCollectionB::class); - $this->assertEquals($transformed->foo, [new TransformCollectionD('a'), new TransformCollectionD('b')]); + $this->assertEquals([new TransformCollectionD('a'), new TransformCollectionD('b')], $transformed->foo); } } From 6420b1b79a96dee19537560b1f4261fca46899ec Mon Sep 17 00:00:00 2001 From: Antoine Bluchet Date: Tue, 20 May 2025 09:14:10 +0200 Subject: [PATCH 3/3] Update src/Symfony/Component/ObjectMapper/Transform/MapCollection.php Co-authored-by: Oskar Stark --- src/Symfony/Component/ObjectMapper/Transform/MapCollection.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Symfony/Component/ObjectMapper/Transform/MapCollection.php b/src/Symfony/Component/ObjectMapper/Transform/MapCollection.php index ebbb2a70353a2..266a5fa7fa8ee 100644 --- a/src/Symfony/Component/ObjectMapper/Transform/MapCollection.php +++ b/src/Symfony/Component/ObjectMapper/Transform/MapCollection.php @@ -23,7 +23,7 @@ */ class MapCollection implements TransformCallableInterface { - public function __construct(private ?ObjectMapperInterface $objectMapper = new ObjectMapper()) + public function __construct(private ObjectMapperInterface $objectMapper = new ObjectMapper()) { }