JMSSerializerExtension.php 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  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\DependencyInjection;
  18. use Symfony\Component\DependencyInjection\Alias;
  19. use Symfony\Component\DependencyInjection\DefinitionDecorator;
  20. use JMS\SerializerBundle\Exception\RuntimeException;
  21. use Symfony\Component\Config\FileLocator;
  22. use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
  23. use Symfony\Component\DependencyInjection\Reference;
  24. use Symfony\Component\Config\Definition\Processor;
  25. use Symfony\Component\DependencyInjection\ContainerBuilder;
  26. use Symfony\Component\HttpKernel\DependencyInjection\Extension;
  27. class JMSSerializerExtension extends Extension
  28. {
  29. public function load(array $configs, ContainerBuilder $container)
  30. {
  31. $config = $this->mergeConfigs($configs, $container->getParameter('kernel.debug'));
  32. $loader = new XmlFileLoader($container, new FileLocator(array(__DIR__.'/../Resources/config/')));
  33. $loader->load('services.xml');
  34. // normalization
  35. $container
  36. ->getDefinition('jms_serializer.camel_case_naming_strategy')
  37. ->addArgument($config['normalization']['naming']['separator'])
  38. ->addArgument($config['normalization']['naming']['lower_case'])
  39. ;
  40. $container
  41. ->getDefinition('jms_serializer.native_php_type_normalizer')
  42. ->addArgument($config['normalization']['date_format'])
  43. ;
  44. if ($config['normalization']['doctrine_support']) {
  45. $container
  46. ->getDefinition('jms_serializer.array_collection_normalizer')
  47. ->addTag('jms_serializer.normalizer')
  48. ;
  49. }
  50. if ($config['normalization']['normalizable_support']) {
  51. $container
  52. ->getDefinition('jms_serializer.normalizable_object_normalizer')
  53. ->addTag('jms_serializer.normalizer')
  54. ;
  55. }
  56. // metadata
  57. if ('none' === $config['metadata']['cache']) {
  58. $container->removeAlias('jms_serializer.metadata.cache');
  59. } else if ('file' === $config['metadata']['cache']) {
  60. $container
  61. ->getDefinition('jms_serializer.metadata.cache.file_cache')
  62. ->replaceArgument(0, $config['metadata']['file_cache']['dir'])
  63. ;
  64. $dir = $container->getParameterBag()->resolveValue($config['metadata']['file_cache']['dir']);
  65. if (!file_exists($dir)) {
  66. if (!$rs = @mkdir($dir, 0777, true)) {
  67. throw new \RuntimeException(sprintf('Could not create cache directory "%s".', $dir));
  68. }
  69. }
  70. } else {
  71. $container->setAlias('jms_serializer.metadata.cache', new Alias($config['metadata']['cache'], false));
  72. }
  73. $container
  74. ->getDefinition('jms_serializer.metadata.metadata_factory')
  75. ->replaceArgument(2, $config['metadata']['debug'])
  76. ;
  77. // versions
  78. if ($config['versions']) {
  79. $serializers = array();
  80. foreach ($config['versions'] as $version) {
  81. $id = md5($version).sha1($version);
  82. $container
  83. ->setDefinition(
  84. $allDefId = 'jms_serializer.disjunct_exclusion_strategy.all.'.$id,
  85. $allDef = new DefinitionDecorator('jms_serializer.disjunct_exclusion_strategy')
  86. )
  87. ;
  88. $container
  89. ->setDefinition(
  90. $noneDefId = 'jms_serializer.disjunct_exclusion_strategy.none.'.$id,
  91. $noneDef = new DefinitionDecorator('jms_serializer.disjunct_exclusion_strategy')
  92. )
  93. ;
  94. $versionExDef = new DefinitionDecorator('jms_serializer.version_exclusion_strategy');
  95. $versionExDef->addArgument($version);
  96. $container->setDefinition($versionExDefId = 'jms_serializer.version_exclusion_strategy.'.$id, $versionExDef);
  97. $allDef->addArgument(array(
  98. new Reference($versionExDefId),
  99. new Reference('jms_serializer.all_exclusion_strategy'),
  100. ));
  101. $noneDef->addArgument(array(
  102. new Reference($versionExDefId),
  103. new Reference('jms_serializer.none_exclusion_strategy'),
  104. ));
  105. $strategies = array(
  106. 'ALL' => new Reference($allDefId),
  107. 'NONE' => new Reference($noneDefId),
  108. );
  109. $container->setDefinition(
  110. $factoryDefId = 'jms_serializer.exclusion_strategy_factory.'.$id,
  111. $factoryDef = new DefinitionDecorator('jms_serializer.exclusion_strategy_factory')
  112. );
  113. $factoryDef->addArgument($strategies);
  114. $container->setDefinition(
  115. $propertyBasedDefId = 'jms_serializer.property_based_normalizer.'.$id,
  116. $propertyBasedDef = new DefinitionDecorator('jms_serializer.property_based_normalizer')
  117. );
  118. $propertyBasedDef->addArgument(new Reference($factoryDefId));
  119. $container->setDefinition(
  120. $serDefId = 'jms_serializer.serializer.'.$id,
  121. $serDef = new DefinitionDecorator('jms_serializer.serializer')
  122. );
  123. $serDef->addTag('jms_serializer.serializer');
  124. $serDef->addArgument(new Reference($propertyBasedDefId));
  125. $serializers[$version] = $serDefId;
  126. }
  127. $container
  128. ->getDefinition('jms_serializer.serializer_factory')
  129. ->addArgument($serializers)
  130. ;
  131. }
  132. }
  133. private function mergeConfigs(array $configs, $debug)
  134. {
  135. $processor = new Processor();
  136. $config = new Configuration($debug);
  137. return $processor->process($config->getConfigTreeBuilder()->buildTree(), $configs);
  138. }
  139. }