SerializerFactory.php 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. <?php
  2. /*
  3. * Copyright 2011 Johannes M. Schmitt <schmittjoh@gmail.com>
  4. *
  5. * Licensed under the Apache License, Version 2.0 (the "License");
  6. * you may not use this file except in compliance with the License.
  7. * You may obtain a copy of the License at
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed on an "AS IS" BASIS,
  13. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. * See the License for the specific language governing permissions and
  15. * limitations under the License.
  16. */
  17. namespace JMS\SerializerBundle\Serializer;
  18. use Symfony\Component\Serializer\SerializerInterface;
  19. use JMS\SerializerBundle\Serializer\Exclusion\ExclusionStrategyFactory;
  20. use JMS\SerializerBundle\Serializer\Naming\PropertyNamingStrategyInterface;
  21. use JMS\SerializerBundle\Serializer\Exclusion\DisjunctExclusionStrategy;
  22. use JMS\SerializerBundle\Serializer\Exclusion\VersionExclusionStrategy;
  23. use JMS\SerializerBundle\Serializer\Exclusion\NoneExclusionStrategy;
  24. use JMS\SerializerBundle\Serializer\Exclusion\AllExclusionStrategy;
  25. use Doctrine\Common\Annotations\AnnotationReader;
  26. use Symfony\Component\Serializer\Serializer;
  27. class SerializerFactory
  28. {
  29. private $reader;
  30. private $propertyNamingStrategy;
  31. private $encoders;
  32. public function __construct(AnnotationReader $reader, PropertyNamingStrategyInterface $propertyNamingStrategy, array $encoders)
  33. {
  34. $this->reader = $reader;
  35. $this->propertyNamingStrategy = $propertyNamingStrategy;
  36. $this->encoders = $encoders;
  37. }
  38. public function configureSerializer(SerializerInterface $serializer, $version = null)
  39. {
  40. if (null === $version) {
  41. $strategies = array(
  42. 'ALL' => new AllExclusionStrategy($this->reader),
  43. 'NONE' => new NoneExclusionStrategy($this->reader),
  44. );
  45. } else {
  46. $versionStrategy = new VersionExclusionStrategy($this->reader, $version);
  47. $strategies = array(
  48. 'ALL' => new DisjunctExclusionStrategy(array(
  49. $versionStrategy, new AllExclusionStrategy($this->reader)
  50. )),
  51. 'NONE' => new DisjunctExclusionStrategy(array(
  52. $versionStrategy, new NoneExclusionStrategy($this->reader),
  53. )),
  54. );
  55. }
  56. $serializer->addNormalizer(new AnnotatedNormalizer($this->reader, $this->propertyNamingStrategy, new ExclusionStrategyFactory($strategies)));
  57. foreach ($this->encoders as $format => $encoder) {
  58. $serializer->setEncoder($format, $encoder);
  59. }
  60. }
  61. public function getSerializer($version = null)
  62. {
  63. $serializer = new Serializer();
  64. $this->configureSerializer($serializer, $version);
  65. return $serializer;
  66. }
  67. }