Skip to content

Commit 079c746

Browse files
authored
fix(openapi): don't inherit name converter from a possibly-missing Symfony parent (#8386)
Fixes #8385
1 parent 56de597 commit 079c746

2 files changed

Lines changed: 20 additions & 2 deletions

File tree

src/Symfony/Bundle/Resources/config/openapi.php

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,17 @@
2323
use ApiPlatform\OpenApi\Serializer\SerializerContextBuilder;
2424
use ApiPlatform\OpenApi\State\OpenApiProvider;
2525
use ApiPlatform\Serializer\JsonEncoder;
26+
use Symfony\Component\Serializer\NameConverter\MetadataAwareNameConverter;
2627
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
2728
use Symfony\Component\Serializer\Serializer;
2829

2930
return function (ContainerConfigurator $container) {
3031
$services = $container->services();
3132

32-
$services->set('api_platform.openapi.name_converter')
33-
->parent('serializer.name_converter.metadata_aware.abstract');
33+
// A metadata-aware name converter isolated from Symfony's global one so the generated
34+
// document only honors serializer metadata (e.g. #[SerializedName]) without the global name converter.
35+
$services->set('api_platform.openapi.name_converter', MetadataAwareNameConverter::class)
36+
->args([service('serializer.mapping.class_metadata_factory')]);
3437

3538
$services->set('api_platform.openapi.normalizer', OpenApiNormalizer::class)
3639
->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')])])

src/Symfony/Tests/Bundle/DependencyInjection/ApiPlatformExtensionTest.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,11 @@
3232
use PHPUnit\Framework\TestCase;
3333
use Symfony\Bundle\SecurityBundle\SecurityBundle;
3434
use Symfony\Bundle\TwigBundle\TwigBundle;
35+
use Symfony\Component\DependencyInjection\ChildDefinition;
3536
use Symfony\Component\DependencyInjection\ContainerBuilder;
3637
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
3738
use Symfony\Component\HttpFoundation\Response;
39+
use Symfony\Component\Serializer\NameConverter\MetadataAwareNameConverter;
3840

3941
class ApiPlatformExtensionTest extends TestCase
4042
{
@@ -301,6 +303,19 @@ public function testSwaggerUiEnabledConfiguration(): void
301303
$this->assertContainerHas($services);
302304
}
303305

306+
public function testOpenApiNameConverterDoesNotDependOnMissingSymfonyParent(): void
307+
{
308+
$config = self::DEFAULT_CONFIG;
309+
$config['api_platform']['enable_swagger'] = true;
310+
311+
(new ApiPlatformExtension())->load($config, $this->container);
312+
313+
$definition = $this->container->getDefinition('api_platform.openapi.name_converter');
314+
315+
$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.');
316+
$this->assertSame(MetadataAwareNameConverter::class, $definition->getClass());
317+
}
318+
304319
public function testReDocEnabledWithSwaggerUiDisabledConfiguration(): void
305320
{
306321
$config = self::DEFAULT_CONFIG;

0 commit comments

Comments
 (0)