Prechádzať zdrojové kódy

Added options for JsonSerializationVisitor

Vyacheslav Salakhutdinov 13 rokov pred
rodič
commit
4be3f29090

+ 59 - 0
DependencyInjection/Configuration.php

@@ -21,6 +21,7 @@ namespace JMS\SerializerBundle\DependencyInjection;
 use Symfony\Component\Config\Definition\Builder\NodeBuilder;
 use Symfony\Component\Config\Definition\Builder\TreeBuilder;
 use Symfony\Component\Config\Definition\ConfigurationInterface;
+use JMS\SerializerBundle\Exception\InvalidArgumentException;
 
 class Configuration implements ConfigurationInterface
 {
@@ -44,6 +45,7 @@ class Configuration implements ConfigurationInterface
 
         $this->addSerializersSection($root);
         $this->addMetadataSection($root);
+        $this->addVisitorsSection($root);
 
         return $tb;
     }
@@ -103,4 +105,61 @@ class Configuration implements ConfigurationInterface
             ->end()
         ;
     }
+
+    private function addVisitorsSection(NodeBuilder $builder)
+    {
+        $builder
+            ->arrayNode('visitors')
+                ->addDefaultsIfNotSet()
+                ->children()
+                    ->arrayNode('json')
+                        ->addDefaultsIfNotSet()
+                        ->children()
+                            ->scalarNode('options')
+                                ->defaultValue(0)
+                                ->beforeNormalization()
+                                    ->ifArray()->then(function($v) {
+                                        $options = 0;
+                                        foreach ($v as $option) {
+                                            if (is_numeric($option)) {
+                                                $options |= (int) $option;
+                                            } elseif (defined($option)) {
+                                                $options |= constant($option);
+                                            } else {
+                                                throw new InvalidArgumentException('Expected either an integer representing one of the JSON_ constants, or a string of the constant itself.');
+                                            }
+                                        }
+
+                                        return $options;
+                                    })
+                                ->end()
+                                ->beforeNormalization()
+                                    ->ifString()->then(function($v) {
+                                        if (is_numeric($v)) {
+                                            $value = (int) $v;
+                                        } elseif (defined($v)) {
+                                            $value = constant($v);
+                                        } else {
+                                            throw new InvalidArgumentException('Expected either an integer representing one of the JSON_ constants, or a string of the constant itself.');
+                                        }
+
+                                        return $value;
+                                    })
+                                ->end()
+                                ->validate()
+                                    ->always(function($v) {
+                                        if (!is_int($v)) {
+                                            throw new InvalidArgumentException('Expected either integer value or a array of the JSON_ constants.');
+                                        }
+
+                                        return $v;
+                                    })
+                                ->end()
+                            ->end()
+                        ->end()
+                    ->end()
+                ->end()
+            ->end()
+        ;
+    }
 }

+ 4 - 0
DependencyInjection/JMSSerializerExtension.php

@@ -153,6 +153,10 @@ class JMSSerializerExtension extends Extension
             ->getDefinition('jms_serializer.metadata.file_locator')
             ->replaceArgument(0, $directories)
         ;
+
+        $container
+            ->setParameter('jms_serializer.json_serialization_visitor.options', $config['visitors']['json']['options'])
+        ;
     }
 
     public function getConfiguration(array $config, ContainerBuilder $container)

+ 9 - 5
Resources/config/services.xml

@@ -12,10 +12,10 @@
         <parameter key="jms_serializer.metadata.xml_driver.class">JMS\SerializerBundle\Metadata\Driver\XmlDriver</parameter>
         <parameter key="jms_serializer.metadata.php_driver.class">JMS\SerializerBundle\Metadata\Driver\PhpDriver</parameter>
         <parameter key="jms_serializer.metadata.lazy_loading_driver.class">Metadata\Driver\LazyLoadingDriver</parameter>
-        
+
         <parameter key="jms_serializer.metadata.metadata_factory.class">Metadata\MetadataFactory</parameter>
         <parameter key="jms_serializer.metadata.cache.file_cache.class">Metadata\Cache\FileCache</parameter>
-    
+
         <parameter key="jms_serializer.camel_case_naming_strategy.class">JMS\SerializerBundle\Serializer\Naming\CamelCaseNamingStrategy</parameter>
         <parameter key="jms_serializer.serialized_name_annotation_strategy.class">JMS\SerializerBundle\Serializer\Naming\SerializedNameAnnotationStrategy</parameter>
         <parameter key="jms_serializer.cache_naming_strategy.class">JMS\SerializerBundle\Serializer\Naming\CacheNamingStrategy</parameter>
@@ -27,13 +27,14 @@
         <parameter key="jms_serializer.serializer.class">JMS\SerializerBundle\Serializer\LazyLoadingSerializer</parameter>
 
         <parameter key="jms_serializer.twig_extension.class">JMS\SerializerBundle\Twig\SerializerExtension</parameter>
-        
+
         <parameter key="jms_serializer.json_serialization_visitor.class">JMS\SerializerBundle\Serializer\JsonSerializationVisitor</parameter>
+        <parameter key="jms_serializer.json_serialization_visitor.options" type="collection"></parameter>
         <parameter key="jms_serializer.json_deserialization_visitor.class">JMS\SerializerBundle\Serializer\JsonDeserializationVisitor</parameter>
         <parameter key="jms_serializer.xml_serialization_visitor.class">JMS\SerializerBundle\Serializer\XmlSerializationVisitor</parameter>
         <parameter key="jms_serializer.xml_deserialization_visitor.class">JMS\SerializerBundle\Serializer\XmlDeserializationVisitor</parameter>
         <parameter key="jms_serializer.yaml_serialization_visitor.class">JMS\SerializerBundle\Serializer\YamlSerializationVisitor</parameter>
-        
+
         <parameter key="jms_serializer.object_based_custom_handler.class">JMS\SerializerBundle\Serializer\Handler\ObjectBasedCustomHandler</parameter>
         <parameter key="jms_serializer.datetime_handler.class">JMS\SerializerBundle\Serializer\Handler\DateTimeHandler</parameter>
         <parameter key="jms_serializer.array_collection_handler.class">JMS\SerializerBundle\Serializer\Handler\ArrayCollectionHandler</parameter>
@@ -127,6 +128,9 @@
         <service id="jms_serializer.json_serialization_visitor" class="%jms_serializer.json_serialization_visitor.class%" public="false">
             <argument type="service" id="jms_serializer.naming_strategy" />
             <argument type="collection" /><!-- Custom Handlers -->
+            <call method="setOptions">
+                <argument>%jms_serializer.json_serialization_visitor.options%</argument>
+            </call>
             <tag name="jms_serializer.serialization_visitor" format="json" />
         </service>
         <service id="jms_serializer.json_deserialization_visitor" class="%jms_serializer.json_deserialization_visitor.class%" public="false">
@@ -151,7 +155,7 @@
             <argument type="collection" /><!-- Custom Handlers -->
             <tag name="jms_serializer.serialization_visitor" format="yml" />
         </service>
-        
+
         <!-- Custom Handlers -->
         <service id="jms_serializer.object_based_custom_handler" class="%jms_serializer.object_based_custom_handler.class%" public="false">
             <argument type="service" id="jms_serializer.unserialize_object_constructor" />

+ 13 - 1
Serializer/JsonSerializationVisitor.php

@@ -20,8 +20,20 @@ namespace JMS\SerializerBundle\Serializer;
 
 class JsonSerializationVisitor extends GenericSerializationVisitor
 {
+    private $options = 0;
+
     public function getResult()
     {
-        return json_encode($this->getRoot());
+        return json_encode($this->getRoot(), $this->getOptions());
+    }
+
+    public function getOptions()
+    {
+        return $this->options;
+    }
+
+    public function setOptions($options)
+    {
+        $this->options = $options;
     }
 }

+ 36 - 0
Tests/DependencyInjection/JMSSerializerExtensionTest.php

@@ -87,6 +87,42 @@ class JMSSerializerExtensionTest extends \PHPUnit_Framework_TestCase
         $this->assertEquals(json_encode(array('name' => 'bar')), $serializer->serialize($versionedObject, 'json'));
     }
 
+    public function testJsonVisitorOptions()
+    {
+        $configs = array(
+            384 => array(array(
+                'visitors' => array(
+                    'json' => array(
+                        'options' => array('JSON_UNESCAPED_UNICODE', 'JSON_PRETTY_PRINT')
+                    )
+                )
+            )),
+            256 => array(array(
+                'visitors' => array(
+                    'json' => array(
+                        'options' => 'JSON_UNESCAPED_UNICODE'
+                    )
+                )
+            )),
+            128 => array(array(
+                'visitors' => array(
+                    'json' => array(
+                        'options' => 128
+                    )
+                )
+            )),
+            0 => array(array())
+        );
+
+        foreach ($configs as $jsonOptions => $config) {
+            $container = $this->getContainerForConfig($config);
+
+            $jsonSerializationVisitor = $container->get('jms_serializer.json_serialization_visitor');
+
+            $this->assertEquals($jsonOptions, $jsonSerializationVisitor->getOptions());
+        }
+    }
+
     private function getContainerForConfig(array $configs, KernelInterface $kernel = null)
     {
         if (null === $kernel) {