Browse Source

fixes Date deserialization

Johannes M. Schmitt 12 năm trước cách đây
mục cha
commit
c848d9e431

+ 21 - 16
Serializer/Handler/DateTimeHandler.php

@@ -25,6 +25,8 @@ use JMS\SerializerBundle\Serializer\XmlDeserializationVisitor;
 use JMS\SerializerBundle\Exception\RuntimeException;
 use JMS\SerializerBundle\Serializer\JsonSerializationVisitor;
 use JMS\SerializerBundle\Serializer\XmlSerializationVisitor;
+use JMS\SerializerBundle\Serializer\VisitorInterface;
+use JMS\SerializerBundle\Serializer\GraphNavigator;
 
 class DateTimeHandler implements SubscribingHandlerInterface
 {
@@ -37,8 +39,16 @@ class DateTimeHandler implements SubscribingHandlerInterface
         foreach (array('json', 'xml', 'yml') as $format) {
             $methods[] = array(
                 'type' => 'DateTime',
+                'direction' => GraphNavigator::DIRECTION_DESERIALIZATION,
                 'format' => $format,
             );
+
+            $methods[] = array(
+                'type' => 'DateTime',
+                'format' => $format,
+                'direction' => GraphNavigator::DIRECTION_SERIALIZATION,
+                'method' => 'serializeDateTime',
+            );
         }
 
         return $methods;
@@ -50,32 +60,27 @@ class DateTimeHandler implements SubscribingHandlerInterface
         $this->defaultTimezone = new \DateTimeZone($defaultTimezone);
     }
 
-    public function serializeDateTimeToXml(XmlSerializationVisitor $visitor, \DateTime $date, array $type)
+    public function serializeDateTime(VisitorInterface $visitor, \DateTime $date, array $type)
     {
-        if (null === $visitor->document) {
-            $visitor->document = $visitor->createDocument(null, null, true);
-        }
-
-        return $visitor->document->createTextNode($date->format($this->getFormat($type)));
-    }
-
-    public function serializeDateTimeToYml(YamlSerializationVisitor $visitor, \DateTime $date, array $type)
-    {
-        return Inline::dump($date->format($this->getFormat($type)));
-    }
-
-    public function serializeDateTimeToJson(JsonSerializationVisitor $visitor, \DateTime $date, array $type)
-    {
-        return $date->format($this->getFormat($type));
+        return $visitor->visitString($date->format($this->getFormat($type)), $type);
     }
 
     public function deserializeDateTimeFromXml(XmlDeserializationVisitor $visitor, $data, array $type)
     {
+        $attributes = $data->attributes();
+        if (isset($attributes['nil'][0]) && (string) $attributes['nil'][0] === 'true') {
+            return null;
+        }
+
         return $this->parseDateTime($data, $type);
     }
 
     public function deserializeDateTimeFromJson(JsonDeserializationVisitor $visitor, $data, array $type)
     {
+        if (null === $data) {
+            return null;
+        }
+
         return $this->parseDateTime($data, $type);
     }
 

+ 1 - 1
Serializer/Handler/HandlerRegistry.php

@@ -22,7 +22,7 @@ class HandlerRegistry implements HandlerRegistryInterface
                 return 'serialize'.$type.'To'.$format;
 
             default:
-                throw new \LogicException(sprintf('The direction %s does not exist.', json_encode($direction)));
+                throw new \LogicException(sprintf('The direction %s does not exist; see GraphNavigator::DIRECTION_??? constants.', json_encode($direction)));
         }
     }
 

+ 2 - 1
Tests/Serializer/BaseSerializationTest.php

@@ -245,6 +245,7 @@ abstract class BaseSerializationTest extends \PHPUnit_Framework_TestCase
 
     /**
      * @dataProvider getDateTime
+     * @group datetime
      */
     public function testDateTime($key, $value, $type)
     {
@@ -290,7 +291,7 @@ abstract class BaseSerializationTest extends \PHPUnit_Framework_TestCase
         }
 
         $objectConstructor = new InitializedObjectConstructor();
-        $this->serializer = new Serializer($this->factory, $this->handlerRegistry, $objectConstructor, $this->dispatcher, null, $this->serializationVisitors, $this->deserializationVisitors);
+        $this->serializer = new Serializer($this->factory, $this->handlerRegistry, $objectConstructor, $this->serializationVisitors, $this->deserializationVisitors, $this->dispatcher);
         $this->serializer->setSerializeNull(true);
 
         $post = new BlogPost('This is a nice title.', $author = new Author('Foo Bar'), new \DateTime('2011-07-30 00:00', new \DateTimeZone('UTC')));