JMSSerializerExtension.php 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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. // property naming
  35. $container
  36. ->getDefinition('jms_serializer.camel_case_naming_strategy')
  37. ->addArgument($config['property_naming']['separator'])
  38. ->addArgument($config['property_naming']['lower_case'])
  39. ;
  40. // datetime handler
  41. if (isset($config['handlers']['datetime'])) {
  42. $container
  43. ->getDefinition('jms_serializer.datetime_handler')
  44. ->addArgument($config['handlers']['datetime']['format'])
  45. ->addArgument($config['handlers']['datetime']['default_timezone'])
  46. ;
  47. } else {
  48. $container->removeDefinition('jms_serializer.datetime_handler');
  49. }
  50. // array collection handler
  51. if (!$config['handlers']['array_collection']) {
  52. $container->removeDefinition('jms_serializer.array_collection_handler');
  53. }
  54. // metadata
  55. if ('none' === $config['metadata']['cache']) {
  56. $container->removeAlias('jms_serializer.metadata.cache');
  57. } else if ('file' === $config['metadata']['cache']) {
  58. $container
  59. ->getDefinition('jms_serializer.metadata.cache.file_cache')
  60. ->replaceArgument(0, $config['metadata']['file_cache']['dir'])
  61. ;
  62. $dir = $container->getParameterBag()->resolveValue($config['metadata']['file_cache']['dir']);
  63. if (!file_exists($dir)) {
  64. if (!$rs = @mkdir($dir, 0777, true)) {
  65. throw new RuntimeException(sprintf('Could not create cache directory "%s".', $dir));
  66. }
  67. }
  68. } else {
  69. $container->setAlias('jms_serializer.metadata.cache', new Alias($config['metadata']['cache'], false));
  70. }
  71. $container
  72. ->getDefinition('jms_serializer.metadata_factory')
  73. ->replaceArgument(2, $config['metadata']['debug'])
  74. ;
  75. }
  76. private function mergeConfigs(array $configs, $debug)
  77. {
  78. $processor = new Processor();
  79. $config = new Configuration($debug);
  80. return $processor->process($config->getConfigTreeBuilder()->buildTree(), $configs);
  81. }
  82. }