diff --git a/src/Symfony/Bundle/Resources/config/openapi.php b/src/Symfony/Bundle/Resources/config/openapi.php index a45f051f9fc..c0cdfd3286b 100644 --- a/src/Symfony/Bundle/Resources/config/openapi.php +++ b/src/Symfony/Bundle/Resources/config/openapi.php @@ -23,14 +23,17 @@ use ApiPlatform\OpenApi\Serializer\SerializerContextBuilder; use ApiPlatform\OpenApi\State\OpenApiProvider; use ApiPlatform\Serializer\JsonEncoder; +use Symfony\Component\Serializer\NameConverter\MetadataAwareNameConverter; use Symfony\Component\Serializer\Normalizer\ObjectNormalizer; use Symfony\Component\Serializer\Serializer; return function (ContainerConfigurator $container) { $services = $container->services(); - $services->set('api_platform.openapi.name_converter') - ->parent('serializer.name_converter.metadata_aware.abstract'); + // A metadata-aware name converter isolated from Symfony's global one so the generated + // document only honors serializer metadata (e.g. #[SerializedName]) without the global name converter. + $services->set('api_platform.openapi.name_converter', MetadataAwareNameConverter::class) + ->args([service('serializer.mapping.class_metadata_factory')]); $services->set('api_platform.openapi.normalizer', OpenApiNormalizer::class) ->args([inline_service(Serializer::class)->arg(0, [inline_service(ObjectNormalizer::class)->arg(0, service('serializer.mapping.class_metadata_factory'))->arg(1, service('api_platform.openapi.name_converter'))->arg(2, service('api_platform.property_accessor'))->arg(3, service('api_platform.property_info'))])->arg(1, [service('serializer.encoder.json')])]) diff --git a/src/Symfony/Tests/Bundle/DependencyInjection/ApiPlatformExtensionTest.php b/src/Symfony/Tests/Bundle/DependencyInjection/ApiPlatformExtensionTest.php index 5505f07337a..854a06f2515 100644 --- a/src/Symfony/Tests/Bundle/DependencyInjection/ApiPlatformExtensionTest.php +++ b/src/Symfony/Tests/Bundle/DependencyInjection/ApiPlatformExtensionTest.php @@ -32,9 +32,11 @@ use PHPUnit\Framework\TestCase; use Symfony\Bundle\SecurityBundle\SecurityBundle; use Symfony\Bundle\TwigBundle\TwigBundle; +use Symfony\Component\DependencyInjection\ChildDefinition; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag; use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\Serializer\NameConverter\MetadataAwareNameConverter; class ApiPlatformExtensionTest extends TestCase { @@ -301,6 +303,19 @@ public function testSwaggerUiEnabledConfiguration(): void $this->assertContainerHas($services); } + public function testOpenApiNameConverterDoesNotDependOnMissingSymfonyParent(): void + { + $config = self::DEFAULT_CONFIG; + $config['api_platform']['enable_swagger'] = true; + + (new ApiPlatformExtension())->load($config, $this->container); + + $definition = $this->container->getDefinition('api_platform.openapi.name_converter'); + + $this->assertNotInstanceOf(ChildDefinition::class, $definition, 'The OpenAPI name converter must not depend on Symfony\'s "serializer.name_converter.metadata_aware.abstract" parent, which does not exist when no name converter is configured.'); + $this->assertSame(MetadataAwareNameConverter::class, $definition->getClass()); + } + public function testReDocEnabledWithSwaggerUiDisabledConfiguration(): void { $config = self::DEFAULT_CONFIG;