vendor/friendsofsymfony/rest-bundle/Serializer/JMSSerializerAdapter.php line 43

Open in your IDE?
  1. <?php
  2. /*
  3. * This file is part of the FOSRestBundle package.
  4. *
  5. * (c) FriendsOfSymfony <http://friendsofsymfony.github.com/>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace FOS\RestBundle\Serializer;
  11. use FOS\RestBundle\Context\Context;
  12. use JMS\Serializer\Context as JMSContext;
  13. use JMS\Serializer\ContextFactory\DeserializationContextFactoryInterface;
  14. use JMS\Serializer\ContextFactory\SerializationContextFactoryInterface;
  15. use JMS\Serializer\DeserializationContext;
  16. use JMS\Serializer\SerializationContext;
  17. use JMS\Serializer\SerializerInterface;
  18. /**
  19. * Adapter to plug the JMS serializer into the FOSRestBundle Serializer API.
  20. *
  21. * @author Christian Flothmann <christian.flothmann@xabbuh.de>
  22. */
  23. final class JMSSerializerAdapter implements Serializer
  24. {
  25. /**
  26. * @internal
  27. */
  28. const SERIALIZATION = 0;
  29. /**
  30. * @internal
  31. */
  32. const DESERIALIZATION = 1;
  33. private $serializer;
  34. private $serializationContextFactory;
  35. private $deserializationContextFactory;
  36. public function __construct(
  37. SerializerInterface $serializer,
  38. SerializationContextFactoryInterface $serializationContextFactory = null,
  39. DeserializationContextFactoryInterface $deserializationContextFactory = null
  40. ) {
  41. $this->serializer = $serializer;
  42. $this->serializationContextFactory = $serializationContextFactory;
  43. $this->deserializationContextFactory = $deserializationContextFactory;
  44. }
  45. /**
  46. * {@inheritdoc}
  47. */
  48. public function serialize($data, string $format, Context $context): string
  49. {
  50. $context = $this->convertContext($context, self::SERIALIZATION);
  51. return $this->serializer->serialize($data, $format, $context);
  52. }
  53. /**
  54. * {@inheritdoc}
  55. */
  56. public function deserialize(string $data, string $type, string $format, Context $context)
  57. {
  58. $context = $this->convertContext($context, self::DESERIALIZATION);
  59. return $this->serializer->deserialize($data, $type, $format, $context);
  60. }
  61. private function convertContext(Context $context, int $direction): JMSContext
  62. {
  63. if (self::SERIALIZATION === $direction) {
  64. $jmsContext = $this->serializationContextFactory
  65. ? $this->serializationContextFactory->createSerializationContext()
  66. : SerializationContext::create();
  67. } else {
  68. $jmsContext = $this->deserializationContextFactory
  69. ? $this->deserializationContextFactory->createDeserializationContext()
  70. : DeserializationContext::create();
  71. }
  72. foreach ($context->getAttributes() as $key => $value) {
  73. $jmsContext->setAttribute($key, $value);
  74. }
  75. if (null !== $context->getVersion()) {
  76. $jmsContext->setVersion($context->getVersion());
  77. }
  78. if (null !== $context->getGroups()) {
  79. $jmsContext->setGroups($context->getGroups());
  80. }
  81. if (true === $context->isMaxDepthEnabled()) {
  82. $jmsContext->enableMaxDepthChecks();
  83. }
  84. if (null !== $context->getSerializeNull()) {
  85. $jmsContext->setSerializeNull($context->getSerializeNull());
  86. }
  87. foreach ($context->getExclusionStrategies() as $strategy) {
  88. $jmsContext->addExclusionStrategy($strategy);
  89. }
  90. return $jmsContext;
  91. }
  92. }