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 @@ - + 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); } 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)); + } }