瀏覽代碼

move visitNull into custom handler so not breaking interface

mattw 13 年之前
父節點
當前提交
6ea5ccbfa6

+ 29 - 0
DependencyInjection/Factory/NullHandlerFactory.php

@@ -0,0 +1,29 @@
+<?php
+
+namespace JMS\SerializerBundle\DependencyInjection\Factory;
+
+use JMS\SerializerBundle\DependencyInjection\HandlerFactoryInterface;
+use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
+
+class NullHandlerFactory implements HandlerFactoryInterface
+{
+    public function getConfigKey()
+    {
+        return 'null_handler';
+    }
+
+    public function getType(array $config)
+    {
+        return self::TYPE_SERIALIZATION;
+    }
+
+    public function addConfiguration(ArrayNodeDefinition $builder)
+    {
+        $builder->addDefaultsIfNotSet();
+    }
+
+    public function getHandlerId(\Symfony\Component\DependencyInjection\ContainerBuilder $container, array $config)
+    {
+        return 'jms_serializer.null_handler';
+    }
+}

+ 2 - 0
JMSSerializerBundle.php

@@ -24,6 +24,7 @@ use JMS\SerializerBundle\DependencyInjection\Factory\ConstraintViolationFactory;
 use JMS\SerializerBundle\DependencyInjection\Factory\ArrayCollectionFactory;
 use JMS\SerializerBundle\DependencyInjection\Factory\ObjectBasedFactory;
 use JMS\SerializerBundle\DependencyInjection\Factory\DoctrineProxyFactory;
+use JMS\SerializerBundle\DependencyInjection\Factory\NullHandlerFactory;
 use JMS\SerializerBundle\DependencyInjection\JMSSerializerExtension;
 use Symfony\Component\HttpKernel\KernelInterface;
 use JMS\SerializerBundle\DependencyInjection\Compiler\SetVisitorsPass;
@@ -43,5 +44,6 @@ class JMSSerializerBundle extends Bundle
         $ext->addHandlerFactory(new ConstraintViolationFactory());
         $ext->addHandlerFactory(new DateTimeFactory());
         $ext->addHandlerFactory(new FormErrorFactory());
+        $ext->addHandlerFactory(new NullHandlerFactory());
     }
 }

+ 2 - 0
Resources/config/services.xml

@@ -41,6 +41,7 @@
         <parameter key="jms_serializer.form_error_handler.class">JMS\SerializerBundle\Serializer\Handler\FormErrorHandler</parameter>
         <parameter key="jms_serializer.constraint_violation_handler.class">JMS\SerializerBundle\Serializer\Handler\ConstraintViolationHandler</parameter>
         <parameter key="jms_serializer.doctrine_handler.class">JMS\SerializerBundle\Serializer\Handler\DoctrineProxyHandler</parameter>
+        <parameter key="jms_serializer.null_handler.class">JMS\SerializerBundle\Serializer\Handler\NullHandler</parameter>
     </parameters>
 
     <services>
@@ -177,5 +178,6 @@
         </service>
         <service id="jms_serializer.constraint_violation_handler" class="%jms_serializer.constraint_violation_handler.class%" public="false" />
         <service id="jms_serializer.doctrine_handler" class="%jms_serializer.doctrine_handler.class%" public="false" />
+        <service id="jms_serializer.null_handler" class="%jms_serializer.null_handler.class%" public="false" />
     </services>
 </container>

+ 0 - 5
Serializer/GenericSerializationVisitor.php

@@ -78,11 +78,6 @@ abstract class GenericSerializationVisitor extends AbstractSerializationVisitor
         return $data;
     }
 
-    public function visitNull($data, $type)
-    {
-        return null;
-    }
-
     public function visitArray($data, $type)
     {
         if (null === $this->root) {

+ 2 - 4
Serializer/GraphNavigator.php

@@ -52,9 +52,7 @@ final class GraphNavigator
             }
         }
 
-        if ('NULL' === $type) {
-            return $visitor->visitNull($data, $type);
-        } else if ('string' === $type) {
+        if ('string' === $type) {
             return $visitor->visitString($data, $type);
         } else if ('integer' === $type) {
             return $visitor->visitInteger($data, $type);
@@ -88,7 +86,7 @@ final class GraphNavigator
             $handled = false;
             $rs = $visitor->visitUsingCustomHandler($data, $type, $handled);
             if ($handled) {
-                if (self::DIRECTION_SERIALIZATION === $this->direction) {
+                if (null !== $data && self::DIRECTION_SERIALIZATION === $this->direction) {
                     $this->visiting->detach($data);
                 }
 

+ 43 - 0
Serializer/Handler/NullHandler.php

@@ -0,0 +1,43 @@
+<?php
+
+namespace JMS\SerializerBundle\Serializer\Handler;
+
+use JMS\SerializerBundle\Serializer\Handler\SerializationHandlerInterface;
+use JMS\SerializerBundle\Serializer\VisitorInterface;
+use JMS\SerializerBundle\Serializer\XmlSerializationVisitor;
+use JMS\SerializerBundle\Serializer\GenericSerializationVisitor;
+use JMS\SerializerBundle\Serializer\YamlSerializationVisitor;
+use Symfony\Component\Yaml\Inline;
+
+class NullHandler implements SerializationHandlerInterface
+{
+    public function serialize(VisitorInterface $visitor, $data, $type, &$handled)
+    {
+        if ($data !== null) {
+            return;
+        }
+
+        if ($visitor instanceof XmlSerializationVisitor) {
+
+            if (null === $visitor->document) {
+                $visitor->document = $visitor->createDocument(null, null, true);
+            }
+            $handled = true;
+
+            $attr = $visitor->document->createAttribute('xsi:nil');
+            $attr->value = 'true';
+            return $attr;
+
+        } else if ($visitor instanceof GenericSerializationVisitor) {
+
+            $handled = true;
+            return null;
+
+        } else if ($visitor instanceof YamlSerializationVisitor) {
+
+            $handled = true;
+            return Inline::dump(null);
+
+        }
+    }
+}

+ 0 - 15
Serializer/XmlSerializationVisitor.php

@@ -104,21 +104,6 @@ class XmlSerializationVisitor extends AbstractSerializationVisitor
         return $this->visitNumeric($data, $type);
     }
 
-    public function visitNull($data, $type)
-    {
-        $node = $this->document->createAttribute('xsi:nil');
-        $node->value = 'true';
-
-        if (null === $this->document) {
-            $this->document = $this->createDocument(null, null, true);
-            $this->currentNode->appendChild($this->document->appendChild($node));
-
-            return;
-        }
-
-        return $node;
-    }
-
     public function visitArray($data, $type)
     {
         if (null === $this->document) {

+ 0 - 9
Serializer/YamlSerializationVisitor.php

@@ -70,15 +70,6 @@ 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);

+ 2 - 0
Tests/Serializer/BaseSerializationTest.php

@@ -25,6 +25,7 @@ use JMS\SerializerBundle\Serializer\Construction\UnserializeObjectConstructor;
 use JMS\SerializerBundle\Serializer\Handler\ArrayCollectionHandler;
 use JMS\SerializerBundle\Serializer\Handler\ConstraintViolationHandler;
 use JMS\SerializerBundle\Serializer\Handler\DateTimeHandler;
+use JMS\SerializerBundle\Serializer\Handler\NullHandler;
 use JMS\SerializerBundle\Serializer\Handler\DeserializationHandlerInterface;
 use JMS\SerializerBundle\Serializer\Handler\DoctrineProxyHandler;
 use JMS\SerializerBundle\Serializer\Handler\FormErrorHandler;
@@ -535,6 +536,7 @@ abstract class BaseSerializationTest extends \PHPUnit_Framework_TestCase
             new FormErrorHandler($translatorMock),
             new ConstraintViolationHandler(),
             new DoctrineProxyHandler(),
+            new NullHandler(),
         );
 
         return $handlers;