diff --git a/DependencyInjection/NelmioApiDocExtension.php b/DependencyInjection/NelmioApiDocExtension.php index caf2cc2..ad364c7 100644 --- a/DependencyInjection/NelmioApiDocExtension.php +++ b/DependencyInjection/NelmioApiDocExtension.php @@ -12,6 +12,7 @@ namespace Nelmio\ApiDocBundle\DependencyInjection; use FOS\RestBundle\Controller\Annotations\ParamInterface; +use JMS\Serializer\ContextFactory\SerializationContextFactoryInterface; use JMS\Serializer\Visitor\SerializationVisitorInterface; use Nelmio\ApiDocBundle\ApiDocGenerator; use Nelmio\ApiDocBundle\Describer\ExternalDocDescriber; @@ -169,6 +170,7 @@ final class NelmioApiDocExtension extends Extension implements PrependExtensionI // JMS metadata support if ($config['models']['use_jms']) { $jmsNamingStrategy = interface_exists(SerializationVisitorInterface::class) ? null : new Reference('jms_serializer.naming_strategy'); + $contextFactory = interface_exists(SerializationContextFactoryInterface::class) ? new Reference('jms_serializer.serialization_context_factory') : null; $container->register('nelmio_api_doc.model_describers.jms', JMSModelDescriber::class) ->setPublic(false) @@ -178,6 +180,7 @@ final class NelmioApiDocExtension extends Extension implements PrependExtensionI $config['media_types'], $jmsNamingStrategy, $container->getParameter('nelmio_api_doc.use_validation_groups'), + $contextFactory, ]) ->addTag('nelmio_api_doc.model_describer', ['priority' => 50]); diff --git a/ModelDescriber/JMSModelDescriber.php b/ModelDescriber/JMSModelDescriber.php index 264c813..6958f24 100644 --- a/ModelDescriber/JMSModelDescriber.php +++ b/ModelDescriber/JMSModelDescriber.php @@ -13,6 +13,7 @@ namespace Nelmio\ApiDocBundle\ModelDescriber; use Doctrine\Common\Annotations\Reader; use JMS\Serializer\Context; +use JMS\Serializer\ContextFactory\SerializationContextFactoryInterface; use JMS\Serializer\Exclusion\GroupsExclusionStrategy; use JMS\Serializer\Naming\PropertyNamingStrategyInterface; use JMS\Serializer\SerializationContext; @@ -35,6 +36,8 @@ class JMSModelDescriber implements ModelDescriberInterface, ModelRegistryAwareIn private $factory; + private $contextFactory; + private $namingStrategy; private $doctrineReader; @@ -60,13 +63,15 @@ class JMSModelDescriber implements ModelDescriberInterface, ModelRegistryAwareIn Reader $reader, array $mediaTypes, ?PropertyNamingStrategyInterface $namingStrategy = null, - bool $useValidationGroups = false + bool $useValidationGroups = false, + ?SerializationContextFactoryInterface $contextFactory = null ) { $this->factory = $factory; $this->namingStrategy = $namingStrategy; $this->doctrineReader = $reader; $this->mediaTypes = $mediaTypes; $this->useValidationGroups = $useValidationGroups; + $this->contextFactory = $contextFactory; } /** @@ -187,7 +192,7 @@ class JMSModelDescriber implements ModelDescriberInterface, ModelRegistryAwareIn $stack->unshift($metadataCopy); } } else { - $context = SerializationContext::create(); + $context = $this->contextFactory ? $this->contextFactory->createSerializationContext() : SerializationContext::create(); if (null !== $model->getGroups()) { $context->addExclusionStrategy(new GroupsExclusionStrategy($model->getGroups()));