JMSSerializerExtension.php 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  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\DependencyInjection\ConfigurableExtension;
  19. use Symfony\Component\DependencyInjection\Alias;
  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\DependencyInjection\ContainerBuilder;
  25. class JMSSerializerExtension extends ConfigurableExtension
  26. {
  27. public function loadInternal(array $config, ContainerBuilder $container)
  28. {
  29. $loader = new XmlFileLoader($container, new FileLocator(array(
  30. __DIR__.'/../Resources/config/')));
  31. $loader->load('services.xml');
  32. // property naming
  33. $container
  34. ->getDefinition('jms_serializer.camel_case_naming_strategy')
  35. ->addArgument($config['property_naming']['separator'])
  36. ->addArgument($config['property_naming']['lower_case'])
  37. ;
  38. if ($config['property_naming']['enable_cache']) {
  39. $container
  40. ->getDefinition('jms_serializer.cache_naming_strategy')
  41. ->addArgument(new Reference((string) $container->getAlias('jms_serializer.naming_strategy')))
  42. ;
  43. $container->setAlias('jms_serializer.naming_strategy', 'jms_serializer.cache_naming_strategy');
  44. }
  45. // metadata
  46. if ('none' === $config['metadata']['cache']) {
  47. $container->removeAlias('jms_serializer.metadata.cache');
  48. } elseif ('file' === $config['metadata']['cache']) {
  49. $container
  50. ->getDefinition('jms_serializer.metadata.cache.file_cache')
  51. ->replaceArgument(0, $config['metadata']['file_cache']['dir'])
  52. ;
  53. $dir = $container->getParameterBag()->resolveValue($config['metadata']['file_cache']['dir']);
  54. if (!file_exists($dir)) {
  55. if (!$rs = @mkdir($dir, 0777, true)) {
  56. throw new RuntimeException(sprintf('Could not create cache directory "%s".', $dir));
  57. }
  58. }
  59. } else {
  60. $container->setAlias('jms_serializer.metadata.cache', new Alias($config['metadata']['cache'], false));
  61. }
  62. $container
  63. ->getDefinition('jms_serializer.metadata_factory')
  64. ->replaceArgument(2, $config['metadata']['debug'])
  65. ;
  66. // directories
  67. $directories = array();
  68. $bundles = $container->getParameter('kernel.bundles');
  69. if ($config['metadata']['auto_detection']) {
  70. foreach ($bundles as $name => $class) {
  71. $ref = new \ReflectionClass($class);
  72. $directories[$ref->getNamespaceName()] = dirname($ref->getFileName()).'/Resources/config/serializer';
  73. }
  74. }
  75. foreach ($config['metadata']['directories'] as $directory) {
  76. $directory['path'] = rtrim(str_replace('\\', '/', $directory['path']), '/');
  77. if ('@' === $directory['path'][0]) {
  78. $bundleName = substr($directory['path'], 1, strpos($directory['path'], '/') - 1);
  79. if (!isset($bundles[$bundleName])) {
  80. throw new RuntimeException(sprintf('The bundle "%s" has not been registered with AppKernel. Available bundles: %s', $bundleName, implode(', ', array_keys($bundles))));
  81. }
  82. $ref = new \ReflectionClass($bundles[$bundleName]);
  83. $directory['path'] = dirname($ref->getFileName()).substr($directory['path'], strlen('@'.$bundleName));
  84. }
  85. $directories[rtrim($directory['namespace_prefix'], '\\')] = rtrim($directory['path'], '\\/');
  86. }
  87. $container
  88. ->getDefinition('jms_serializer.metadata.file_locator')
  89. ->replaceArgument(0, $directories)
  90. ;
  91. $container
  92. ->setParameter('jms_serializer.json_serialization_visitor.options', $config['visitors']['json']['options'])
  93. ;
  94. $container
  95. ->setParameter('jms_serializer.xml_deserialization_visitor.doctype_whitelist', $config['visitors']['xml']['doctype_whitelist'])
  96. ;
  97. }
  98. public function getConfiguration(array $config, ContainerBuilder $container)
  99. {
  100. return new Configuration($container->getParameterBag()->resolveValue('%kernel.debug%'));
  101. }
  102. }