vendor/jms/serializer-bundle/DependencyInjection/JMSSerializerExtension.php line 192

Open in your IDE?
  1. <?php
  2. namespace JMS\SerializerBundle\DependencyInjection;
  3. use JMS\Serializer\EventDispatcher\EventSubscriberInterface;
  4. use JMS\Serializer\Exception\RuntimeException;
  5. use JMS\Serializer\Handler\SubscribingHandlerInterface;
  6. use Symfony\Component\Config\FileLocator;
  7. use Symfony\Component\DependencyInjection\Alias;
  8. use Symfony\Component\DependencyInjection\ContainerBuilder;
  9. use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
  10. use Symfony\Component\DependencyInjection\Reference;
  11. use Symfony\Component\Finder\Finder;
  12. use Symfony\Component\HttpKernel\DependencyInjection\ConfigurableExtension;
  13. use Symfony\Component\Stopwatch\Stopwatch;
  14. class JMSSerializerExtension extends ConfigurableExtension
  15. {
  16.     public function loadInternal(array $configContainerBuilder $container)
  17.     {
  18.         $container
  19.             ->registerForAutoconfiguration(EventSubscriberInterface::class)
  20.             ->addTag('jms_serializer.event_subscriber');
  21.         $container
  22.             ->registerForAutoconfiguration(SubscribingHandlerInterface::class)
  23.             ->addTag('jms_serializer.subscribing_handler');
  24.         $loader = new XmlFileLoader($container, new FileLocator(array(
  25.             __DIR__ '/../Resources/config/')));
  26.         $loader->load('services.xml');
  27.         // Built-in handlers.
  28.         $container->getDefinition('jms_serializer.datetime_handler')
  29.             ->addArgument($config['handlers']['datetime']['default_format'])
  30.             ->addArgument($config['handlers']['datetime']['default_timezone'])
  31.             ->addArgument($config['handlers']['datetime']['cdata']);
  32.         $container->getDefinition('jms_serializer.array_collection_handler')
  33.             ->replaceArgument(0$config['handlers']['array_collection']['initialize_excluded']);
  34.         // Built-in subscribers.
  35.         $container->getDefinition('jms_serializer.doctrine_proxy_subscriber')
  36.             ->replaceArgument(0, !$config['subscribers']['doctrine_proxy']['initialize_virtual_types'])
  37.             ->replaceArgument(1$config['subscribers']['doctrine_proxy']['initialize_excluded']);
  38.         // Built-in object constructor.
  39.         $container->getDefinition('jms_serializer.doctrine_object_constructor')
  40.             ->replaceArgument(2$config['object_constructors']['doctrine']['fallback_strategy']);
  41.         // property naming
  42.         $container
  43.             ->getDefinition('jms_serializer.camel_case_naming_strategy')
  44.             ->addArgument($config['property_naming']['separator'])
  45.             ->addArgument($config['property_naming']['lower_case']);
  46.         if (!empty($config['property_naming']['id'])) {
  47.             $container->setAlias('jms_serializer.naming_strategy'$config['property_naming']['id']);
  48.         }
  49.         $bundles $container->getParameter('kernel.bundles');
  50.         if (!empty($config['expression_evaluator']['id'])) {
  51.             $container
  52.                 ->getDefinition('jms_serializer.deserialization_graph_navigator_factory')
  53.                 ->replaceArgument(5, new Reference($config['expression_evaluator']['id']));
  54.             $container
  55.                 ->getDefinition('jms_serializer.serialization_graph_navigator_factory')
  56.                 ->replaceArgument(4, new Reference($config['expression_evaluator']['id']));
  57.             $container
  58.                 ->getDefinition('jms_serializer.accessor_strategy.default')
  59.                 ->setArgument(0, new Reference($config['expression_evaluator']['id']));
  60.         } else {
  61.             $container->removeDefinition('jms_serializer.expression_evaluator');
  62.         }
  63.         // metadata
  64.         if ('none' === $config['metadata']['cache']) {
  65.             $container->removeAlias('jms_serializer.metadata.cache');
  66.         } elseif ('file' === $config['metadata']['cache']) {
  67.             $container
  68.                 ->getDefinition('jms_serializer.metadata.cache.file_cache')
  69.                 ->replaceArgument(0$config['metadata']['file_cache']['dir']);
  70.             $dir $container->getParameterBag()->resolveValue($config['metadata']['file_cache']['dir']);
  71.             if (!is_dir($dir) && !@mkdir($dir0777true) && !is_dir($dir)) {
  72.                 throw new RuntimeException(sprintf('Could not create cache directory "%s".'$dir));
  73.             }
  74.         } else {
  75.             $container->setAlias('jms_serializer.metadata.cache', new Alias($config['metadata']['cache'], false));
  76.         }
  77.         if ($config['metadata']['infer_types_from_doctrine_metadata'] === false) {
  78.             $container->setParameter('jms_serializer.infer_types_from_doctrine_metadata'false);
  79.         }
  80.         $container
  81.             ->getDefinition('jms_serializer.metadata_factory')
  82.             ->replaceArgument(2$config['metadata']['debug']);
  83.         // warmup
  84.         if (!empty($config['metadata']['warmup']['paths']['included']) && class_exists(Finder::class)) {
  85.             $container
  86.                 ->getDefinition('jms_serializer.cache.cache_warmer')
  87.                 ->replaceArgument(0$config['metadata']['warmup']['paths']['included'])
  88.                 ->replaceArgument(2$config['metadata']['warmup']['paths']['excluded']);
  89.         } else {
  90.             $container->removeDefinition('jms_serializer.cache.cache_warmer');
  91.         }
  92.         // directories
  93.         $directories = array();
  94.         if ($config['metadata']['auto_detection']) {
  95.             foreach ($bundles as $name => $class) {
  96.                 $ref = new \ReflectionClass($class);
  97.                 $dir dirname($ref->getFileName()) . '/Resources/config/serializer';
  98.                 if (file_exists($dir)) {
  99.                     $directories[$ref->getNamespaceName()] = $dir;
  100.                 }
  101.             }
  102.         }
  103.         foreach ($config['metadata']['directories'] as $directory) {
  104.             $directory['path'] = rtrim(str_replace('\\''/'$directory['path']), '/');
  105.             if ('@' === $directory['path'][0]) {
  106.                 $pathParts explode('/'$directory['path']);
  107.                 $bundleName substr($pathParts[0], 1);
  108.                 if (!isset($bundles[$bundleName])) {
  109.                     throw new RuntimeException(sprintf('The bundle "%s" has not been registered with AppKernel. Available bundles: %s'$bundleNameimplode(', 'array_keys($bundles))));
  110.                 }
  111.                 $ref = new \ReflectionClass($bundles[$bundleName]);
  112.                 $directory['path'] = dirname($ref->getFileName()) . substr($directory['path'], strlen('@' $bundleName));
  113.             }
  114.             $dir rtrim($directory['path'], '\\/');
  115.             if (!file_exists($dir)) {
  116.                 throw new RuntimeException(sprintf('The metadata directory "%s" does not exist for the namespace "%s"'$dir$directory['namespace_prefix']));
  117.             }
  118.             $directories[rtrim($directory['namespace_prefix'], '\\')] = $dir;
  119.         }
  120.         $container
  121.             ->getDefinition('jms_serializer.metadata.file_locator')
  122.             ->replaceArgument(0$directories);
  123.         $this->setVisitorOptions($config$container);
  124.         if (!$container->getParameter('kernel.debug') || !class_exists(Stopwatch::class)) {
  125.             $container->removeDefinition('jms_serializer.stopwatch_subscriber');
  126.         }
  127.         // context factories
  128.         $services = [
  129.             'serialization' => 'jms_serializer.configured_serialization_context_factory',
  130.             'deserialization' => 'jms_serializer.configured_deserialization_context_factory',
  131.         ];
  132.         foreach ($services as $configKey => $serviceId) {
  133.             $contextFactory $container->getDefinition($serviceId);
  134.             if (isset($config['default_context'][$configKey]['id'])) {
  135.                 $container->setAlias('jms_serializer.' $configKey '_context_factory', new Alias($config['default_context'][$configKey]['id'], true));
  136.                 $container->removeDefinition($serviceId);
  137.                 continue;
  138.             }
  139.             if (isset($config['default_context'][$configKey]['version'])) {
  140.                 $contextFactory->addMethodCall('setVersion', [$config['default_context'][$configKey]['version']]);
  141.             }
  142.             if (isset($config['default_context'][$configKey]['serialize_null'])) {
  143.                 $contextFactory->addMethodCall('setSerializeNulls', [$config['default_context'][$configKey]['serialize_null']]);
  144.             }
  145.             if (!empty($config['default_context'][$configKey]['attributes'])) {
  146.                 $contextFactory->addMethodCall('setAttributes', [$config['default_context'][$configKey]['attributes']]);
  147.             }
  148.             if (!empty($config['default_context'][$configKey]['groups'])) {
  149.                 $contextFactory->addMethodCall('setGroups', [$config['default_context'][$configKey]['groups']]);
  150.             }
  151.             if (!empty($config['default_context'][$configKey]['enable_max_depth_checks'])) {
  152.                 $contextFactory->addMethodCall('enableMaxDepthChecks');
  153.             }
  154.         }
  155.     }
  156.     public function getConfiguration(array $configContainerBuilder $container)
  157.     {
  158.         return new Configuration($container->getParameterBag()->resolveValue('%kernel.debug%'));
  159.     }
  160.     private function setVisitorOptions(array $configContainerBuilder $container): void
  161.     {
  162.         // json (serialization)
  163.         if (isset($config['visitors']['json_serialization']['options'])) {
  164.             $container->getDefinition('jms_serializer.json_serialization_visitor')
  165.                 ->addMethodCall('setOptions', [$config['visitors']['json_serialization']['options']]);
  166.         }
  167.         if (isset($config['visitors']['json_serialization']['depth'])) {
  168.             $container->getDefinition('jms_serializer.json_serialization_visitor')
  169.                 ->addMethodCall('setDepth', [$config['visitors']['json_serialization']['depth']]);
  170.         }
  171.         // json (deserialization)
  172.         if (isset($config['visitors']['json_deserialization']['options'])) {
  173.             $container->getDefinition('jms_serializer.json_deserialization_visitor')
  174.                 ->addMethodCall('setOptions', [$config['visitors']['json_deserialization']['options']]);
  175.         }
  176.         // xml (serialization)
  177.         if (!empty($config['visitors']['xml_serialization']['default_root_name'])) {
  178.             $container->getDefinition('jms_serializer.xml_serialization_visitor')
  179.                 ->addMethodCall('setDefaultRootName', [
  180.                     $config['visitors']['xml_serialization']['default_root_name'],
  181.                     $config['visitors']['xml_serialization']['default_root_ns'],
  182.                 ]);
  183.         }
  184.         if (!empty($config['visitors']['xml_serialization']['version'])) {
  185.             $container->getDefinition('jms_serializer.xml_serialization_visitor')
  186.                 ->addMethodCall('setDefaultVersion', [$config['visitors']['xml_serialization']['version']]);
  187.         }
  188.         if (!empty($config['visitors']['xml_serialization']['encoding'])) {
  189.             $container->getDefinition('jms_serializer.xml_serialization_visitor')
  190.                 ->addMethodCall('setDefaultEncoding', [$config['visitors']['xml_serialization']['encoding']]);
  191.         }
  192.         if (!empty($config['visitors']['xml_serialization']['format_output'])) {
  193.             $container->getDefinition('jms_serializer.xml_serialization_visitor')
  194.                 ->addMethodCall('setFormatOutput', [$config['visitors']['xml_serialization']['format_output']]);
  195.         }
  196.         // xml (deserialization)
  197.         if (!empty($config['visitors']['xml_deserialization']['doctype_whitelist'])) {
  198.             $container->getDefinition('jms_serializer.xml_deserialization_visitor')
  199.                 ->addMethodCall('setDoctypeWhitelist', [$config['visitors']['xml_deserialization']['doctype_whitelist']]);
  200.         }
  201.         if (!empty($config['visitors']['xml_deserialization']['external_entities'])) {
  202.             $container->getDefinition('jms_serializer.xml_deserialization_visitor')
  203.                 ->addMethodCall('enableExternalEntities', [$config['visitors']['xml_deserialization']['external_entities']]);
  204.         }
  205.         if (!empty($config['visitors']['xml_deserialization']['options'])) {
  206.             $container->getDefinition('jms_serializer.xml_deserialization_visitor')
  207.                 ->addMethodCall('setOptions', [$config['visitors']['xml_deserialization']['options']]);
  208.         }
  209.     }
  210. }