From 82dd151fd8f76e11c20a60d4a1d300bd77d9e041 Mon Sep 17 00:00:00 2001 From: soyuka Date: Tue, 26 Jan 2021 16:49:40 +0100 Subject: [PATCH 1/3] Lower the priority of our identifier denormalizers --- src/Bridge/Symfony/Bundle/Resources/config/api.xml | 4 ++-- src/Bridge/Symfony/Bundle/Resources/config/ramsey_uuid.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Bridge/Symfony/Bundle/Resources/config/api.xml b/src/Bridge/Symfony/Bundle/Resources/config/api.xml index 3dac225ca80..3590f964d42 100644 --- a/src/Bridge/Symfony/Bundle/Resources/config/api.xml +++ b/src/Bridge/Symfony/Bundle/Resources/config/api.xml @@ -275,11 +275,11 @@ - + - + diff --git a/src/Bridge/Symfony/Bundle/Resources/config/ramsey_uuid.xml b/src/Bridge/Symfony/Bundle/Resources/config/ramsey_uuid.xml index bbf81f232fa..e094bafdd1d 100644 --- a/src/Bridge/Symfony/Bundle/Resources/config/ramsey_uuid.xml +++ b/src/Bridge/Symfony/Bundle/Resources/config/ramsey_uuid.xml @@ -6,7 +6,7 @@ - + From 0593978ac5ec5b4e2a050a8af55ec6ed2ae4c016 Mon Sep 17 00:00:00 2001 From: soyuka Date: Wed, 27 Jan 2021 08:47:28 +0100 Subject: [PATCH 2/3] Break on supported denormalizer --- src/Identifier/IdentifierConverter.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Identifier/IdentifierConverter.php b/src/Identifier/IdentifierConverter.php index 714d3de7c21..2851581e4a7 100644 --- a/src/Identifier/IdentifierConverter.php +++ b/src/Identifier/IdentifierConverter.php @@ -69,6 +69,7 @@ public function convert($data, string $class, array $context = []): array try { $identifiers[$identifier] = $identifierTransformer->denormalize($value, $type); + break; } catch (InvalidIdentifierException $e) { throw new InvalidIdentifierException(sprintf('Identifier "%s" could not be denormalized.', $identifier), $e->getCode(), $e); } From e2c7ddb38714bcad9380ce6be3c928640508d306 Mon Sep 17 00:00:00 2001 From: soyuka Date: Tue, 2 Feb 2021 15:21:45 +0100 Subject: [PATCH 3/3] add test --- tests/Identifier/IdentifierConverterTest.php | 23 ++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/tests/Identifier/IdentifierConverterTest.php b/tests/Identifier/IdentifierConverterTest.php index ee30a54520e..a450ad90266 100644 --- a/tests/Identifier/IdentifierConverterTest.php +++ b/tests/Identifier/IdentifierConverterTest.php @@ -22,6 +22,7 @@ use ApiPlatform\Core\Tests\ProphecyTrait; use PHPUnit\Framework\TestCase; use Symfony\Component\PropertyInfo\Type; +use Symfony\Component\Serializer\Normalizer\DenormalizerInterface; /** * @author Antoine Bluchet @@ -98,4 +99,26 @@ public function testIntegerIdentifier() $this->assertSame(['id' => 42], $identifierDenormalizer->convert($identifier, $class)); } + + public function testShouldBreakAfterTransforming() + { + $identifier = ['id' => '42']; + $class = 'Dummy'; + + $integerIdentifierPropertyMetadata = (new PropertyMetadata())->withIdentifier(true)->withType(new Type(Type::BUILTIN_TYPE_INT)); + + $propertyMetadataFactory = $this->prophesize(PropertyMetadataFactoryInterface::class); + $propertyMetadataFactory->create($class, 'id')->shouldBeCalled()->willReturn($integerIdentifierPropertyMetadata); + + $identifiersExtractor = $this->prophesize(IdentifiersExtractorInterface::class); + $identifiersExtractor->getIdentifiersFromResourceClass($class)->willReturn(['id']); + + $shouldNotBeCalled = $this->prophesize(DenormalizerInterface::class); + $shouldNotBeCalled->supportsDenormalization()->shouldNotBeCalled(); + + $identifierDenormalizers = [new IntegerDenormalizer(), $shouldNotBeCalled->reveal()]; + $identifierDenormalizer = new IdentifierConverter($identifiersExtractor->reveal(), $propertyMetadataFactory->reveal(), $identifierDenormalizers); + + $this->assertSame(['id' => 42], $identifierDenormalizer->convert($identifier, $class)); + } }