Ver código fonte

add nullable option for yaml visitor

mattw 12 anos atrás
pai
commit
39f2464930

+ 8 - 0
DependencyInjection/Configuration.php

@@ -168,6 +168,14 @@ class Configuration implements ConfigurationInterface
                         ->end()
                     ->end()
                 ->end()
+                ->children()
+                    ->arrayNode('yaml')
+                        ->addDefaultsIfNotSet()
+                        ->children()
+                            ->booleanNode('serialize_null')->defaultFalse()->end()
+                        ->end()
+                    ->end()
+                ->end()
             ->end()
         ;
     }

+ 4 - 0
DependencyInjection/JMSSerializerExtension.php

@@ -157,6 +157,10 @@ class JMSSerializerExtension extends ConfigurableExtension
         $container
             ->setParameter('jms_serializer.xml_serialization_visitor.serialize_null', $config['visitors']['xml']['serialize_null'])
         ;
+
+        $container
+            ->setParameter('jms_serializer.yaml_serialization_visitor.serialize_null', $config['visitors']['yaml']['serialize_null'])
+        ;
     }
 
     public function getConfiguration(array $config, ContainerBuilder $container)

+ 3 - 0
Resources/config/services.xml

@@ -159,6 +159,9 @@
         <service id="jms_serializer.yaml_serialization_visitor" class="%jms_serializer.yaml_serialization_visitor.class%" public="false">
             <argument type="service" id="jms_serializer.naming_strategy" />
             <argument type="collection" /><!-- Custom Handlers -->
+            <call method="setNullable">
+                <argument>%jms_serializer.yaml_serialization_visitor.serialize_null%</argument>
+            </call>
             <tag name="jms_serializer.serialization_visitor" format="yml" />
         </service>
 

+ 11 - 2
Serializer/YamlSerializationVisitor.php

@@ -70,12 +70,21 @@ class YamlSerializationVisitor extends AbstractSerializationVisitor
         return $v;
     }
 
+    public function visitNull($data, $type)
+    {
+        if ('' === $this->writer->content) {
+            $this->writer->writeln('null');
+        }
+
+        return 'null';
+    }
+
     public function visitArray($data, $type)
     {
         $isList = array_keys($data) === range(0, count($data) - 1);
 
         foreach ($data as $k => $v) {
-            if (null === $v) {
+            if (null === $v && (!is_string($k) || !$this->isNullable())) {
                 continue;
             }
 
@@ -150,7 +159,7 @@ class YamlSerializationVisitor extends AbstractSerializationVisitor
         $v = (null === $metadata->getter ? $metadata->reflection->getValue($data)
             : $data->{$metadata->getter}());
 
-        if (null === $v) {
+        if (null === $v && !$this->isNullable()) {
             return;
         }
 

+ 1 - 6
Tests/Serializer/BaseSerializationTest.php

@@ -73,18 +73,12 @@ abstract class BaseSerializationTest extends \PHPUnit_Framework_TestCase
 {
     public function testNullableArray()
     {
-        if (!in_array($this->getFormat(), array('json', 'xml'))) {
-            $this->markTestSkipped('nullable currently only supported by JSON and XML');
-        }
         $arr = array('foo' => 'bar', 'baz' => null, null);
         $this->assertEquals($this->getContent('nullable'), $this->getSerializer(true)->serialize($arr, $this->getFormat()));
     }
 
     public function testNullableObject()
     {
-        if (!in_array($this->getFormat(), array('json', 'xml'))) {
-            $this->markTestSkipped('nullable currently only supported by JSON and XML');
-        }
         $obj = new ObjectWithNullProperty('foo', 'bar');
         $this->assertEquals($this->getContent('simple_object_nullable'), $this->getSerializer(true)->serialize($obj, $this->getFormat()));
     }
@@ -513,6 +507,7 @@ abstract class BaseSerializationTest extends \PHPUnit_Framework_TestCase
         if ($serialize_null) {
             $serializationVisitors['json']->setNullable(true);
             $serializationVisitors['xml']->setNullable(true);
+            $serializationVisitors['yml']->setNullable(true);
         }
 
         $deserializationVisitors = array(

+ 2 - 0
Tests/Serializer/yml/nullable.yml

@@ -0,0 +1,2 @@
+foo: bar
+baz: null

+ 4 - 0
Tests/Serializer/yml/simple_object_nullable.yml

@@ -0,0 +1,4 @@
+foo: foo
+moo: bar
+camel_case: boo
+null_property: null