JMSSerializerExtension.php 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  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\HttpKernel\KernelInterface;
  19. use Symfony\Component\DependencyInjection\Alias;
  20. use Symfony\Component\DependencyInjection\DefinitionDecorator;
  21. use JMS\SerializerBundle\Exception\RuntimeException;
  22. use Symfony\Component\Config\FileLocator;
  23. use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
  24. use Symfony\Component\DependencyInjection\Reference;
  25. use Symfony\Component\Config\Definition\Processor;
  26. use Symfony\Component\DependencyInjection\ContainerBuilder;
  27. use Symfony\Component\HttpKernel\DependencyInjection\Extension;
  28. class JMSSerializerExtension extends Extension
  29. {
  30. public function load(array $configs, ContainerBuilder $container)
  31. {
  32. $config = $this->mergeConfigs($configs, $container->getParameter('kernel.debug'));
  33. $loader = new XmlFileLoader($container, new FileLocator(array(__DIR__.'/../Resources/config/')));
  34. $loader->load('services.xml');
  35. // property naming
  36. $container
  37. ->getDefinition('jms_serializer.camel_case_naming_strategy')
  38. ->addArgument($config['property_naming']['separator'])
  39. ->addArgument($config['property_naming']['lower_case'])
  40. ;
  41. if ($config['property_naming']['enable_cache']) {
  42. $container
  43. ->getDefinition('jms_serializer.cache_naming_strategy')
  44. ->addArgument(new Reference((string) $container->getAlias('jms_serializer.naming_strategy')))
  45. ;
  46. $container->setAlias('jms_serializer.naming_strategy', 'jms_serializer.cache_naming_strategy');
  47. }
  48. // object based custom handler
  49. if (!$config['handlers']['object_based_custom']) {
  50. $container->removeDefinition('jms_serializer.object_based_custom_handler');
  51. }
  52. // datetime handler
  53. if (isset($config['handlers']['datetime'])) {
  54. $container
  55. ->getDefinition('jms_serializer.datetime_handler')
  56. ->addArgument($config['handlers']['datetime']['format'])
  57. ->addArgument($config['handlers']['datetime']['default_timezone'])
  58. ;
  59. } else {
  60. $container->removeDefinition('jms_serializer.datetime_handler');
  61. }
  62. // array collection handler
  63. if (!$config['handlers']['array_collection']) {
  64. $container->removeDefinition('jms_serializer.array_collection_handler');
  65. }
  66. // form error handler
  67. if (!$config['handlers']['form_error']) {
  68. $container->removeDefinition('jms_serializer.form_error_handler');
  69. }
  70. // constraint violation handler
  71. if (!$config['handlers']['constraint_violation']) {
  72. $container->removeDefinition('jms_serializer.constraint_violation_handler');
  73. }
  74. // metadata
  75. if ('none' === $config['metadata']['cache']) {
  76. $container->removeAlias('jms_serializer.metadata.cache');
  77. } else if ('file' === $config['metadata']['cache']) {
  78. $container
  79. ->getDefinition('jms_serializer.metadata.cache.file_cache')
  80. ->replaceArgument(0, $config['metadata']['file_cache']['dir'])
  81. ;
  82. $dir = $container->getParameterBag()->resolveValue($config['metadata']['file_cache']['dir']);
  83. if (!file_exists($dir)) {
  84. if (!$rs = @mkdir($dir, 0777, true)) {
  85. throw new RuntimeException(sprintf('Could not create cache directory "%s".', $dir));
  86. }
  87. }
  88. } else {
  89. $container->setAlias('jms_serializer.metadata.cache', new Alias($config['metadata']['cache'], false));
  90. }
  91. $container
  92. ->getDefinition('jms_serializer.metadata_factory')
  93. ->replaceArgument(2, $config['metadata']['debug'])
  94. ;
  95. // directories
  96. $directories = array();
  97. if ($config['metadata']['auto_detection']) {
  98. foreach ($container->getParameter('kernel.bundles') as $name => $class) {
  99. $ref = new \ReflectionClass($class);
  100. $directories[$ref->getNamespaceName()] = dirname($ref->getFileName()).'/Resources/config/serializer';
  101. }
  102. }
  103. foreach ($config['metadata']['directories'] as $directory) {
  104. $directories[rtrim($directory['namespace_prefix'], '\\')] = rtrim($directory['path'], '\\/');
  105. }
  106. $container
  107. ->getDefinition('jms_serializer.metadata.file_locator')
  108. ->replaceArgument(0, $directories)
  109. ;
  110. }
  111. private function mergeConfigs(array $configs, $debug)
  112. {
  113. $processor = new Processor();
  114. $config = new Configuration($debug);
  115. return $processor->process($config->getConfigTreeBuilder()->buildTree(), $configs);
  116. }
  117. }