浏览代码

added object_based_custom service and fixed deserialization

Lukas Kahwe Smith 13 年之前
父节点
当前提交
5cb007b88c

+ 6 - 1
DependencyInjection/JMSSerializerExtension.php

@@ -51,6 +51,11 @@ class JMSSerializerExtension extends Extension
             $container->setAlias('jms_serializer.naming_strategy', 'jms_serializer.cache_naming_strategy');
         }
 
+        // object based custom handler
+        if (!$config['handlers']['object_based_custom']) {
+            $container->removeDefinition('jms_serializer.object_based_custom_handler');
+        }
+
         // datetime handler
         if (isset($config['handlers']['datetime'])) {
             $container
@@ -125,4 +130,4 @@ class JMSSerializerExtension extends Extension
 
         return $processor->process($config->getConfigTreeBuilder()->buildTree(), $configs);
     }
-}
+}

+ 8 - 1
Resources/config/services.xml

@@ -31,6 +31,7 @@
         <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.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>
         <parameter key="jms_serializer.form_error_handler.class">JMS\SerializerBundle\Serializer\Handler\FormErrorHandler</parameter>
@@ -137,6 +138,12 @@
         </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" />
+            <argument type="service" id="jms_serializer.metadata_factory" />
+            <tag name="jms_serializer.serialization_handler" />
+            <tag name="jms_serializer.deserialization_handler" />
+        </service>
         <service id="jms_serializer.datetime_handler" class="%jms_serializer.datetime_handler.class%" public="false">
             <tag name="jms_serializer.serialization_handler" />
             <tag name="jms_serializer.deserialization_handler" />
@@ -152,4 +159,4 @@
             <tag name="jms_serializer.serialization_handler" />
         </service>
     </services>
-</container>
+</container>

+ 1 - 0
Resources/doc/index.rst

@@ -53,6 +53,7 @@ suit your needs::
 
     jms_serializer:
         handlers:
+            object_based_custom: true
             datetime:
                 format: Y-m-dTH:i:s
                 default_timezone: UTC

+ 5 - 4
Serializer/Handler/ObjectBasedCustomHandler.php

@@ -12,7 +12,7 @@ class ObjectBasedCustomHandler implements SerializationHandlerInterface, Deseria
     private $objectConstructor;
     private $metadataFactory;
 
-    public function __construct(ObjectConstructorInterface $constructor, MetadataFactoryInterface $metadata)
+    public function __construct(ObjectConstructorInterface $objectConstructor, MetadataFactoryInterface $metadataFactory)
     {
         $this->objectConstructor = $objectConstructor;
         $this->metadataFactory = $metadataFactory;
@@ -29,15 +29,16 @@ class ObjectBasedCustomHandler implements SerializationHandlerInterface, Deseria
 
     public function deserialize(VisitorInterface $visitor, $data, $type, &$handled)
     {
-        if (!is_a($type, 'JMS\SerializerBundle\Serializer\Handler\DeserializationHandlerInterface')) {
+        if (!in_array('JMS\SerializerBundle\Serializer\Handler\DeserializationHandlerInterface', class_implements($type))) {
             return;
         }
 
         $metadata = $this->metadataFactory->getMetadataForClass($type);
 
-        $instance = $this->objectConstructor->construct($visitor, $metadata, $data, $type);
+        $visitor->startVisitingObject($metadata, $data, $type);
+        $instance = $visitor->getResult();
         $instance->deserialize($visitor, $data, $type, $handled);
 
         return $instance;
     }
-}
+}

+ 19 - 3
Tests/Serializer/BaseSerializationTest.php

@@ -32,6 +32,7 @@ use JMS\SerializerBundle\Serializer\Construction\UnserializeObjectConstructor;
 use JMS\SerializerBundle\Serializer\JsonDeserializationVisitor;
 use JMS\SerializerBundle\Tests\Fixtures\Log;
 use JMS\SerializerBundle\Serializer\Handler\ArrayCollectionHandler;
+use JMS\SerializerBundle\Serializer\Handler\ObjectBasedCustomHandler;
 use JMS\SerializerBundle\Serializer\Handler\DateTimeHandler;
 use JMS\SerializerBundle\Serializer\Handler\FormErrorHandler;
 use JMS\SerializerBundle\Serializer\Handler\ConstraintViolationHandler;
@@ -288,7 +289,11 @@ abstract class BaseSerializationTest extends \PHPUnit_Framework_TestCase
             ->method('trans')
             ->will($this->returnArgument(0));
 
+        $factory = new MetadataFactory(new AnnotationDriver(new AnnotationReader()));
+        $objectConstructor = new UnserializeObjectConstructor();
+
         $handlers = array(
+            new ObjectBasedCustomHandler($objectConstructor, $factory),
             new DateTimeHandler(),
             new FormErrorHandler($translatorMock),
             new ConstraintViolationHandler(),
@@ -299,7 +304,11 @@ abstract class BaseSerializationTest extends \PHPUnit_Framework_TestCase
 
     protected function getDeserializationHandlers()
     {
+        $factory = new MetadataFactory(new AnnotationDriver(new AnnotationReader()));
+        $objectConstructor = new UnserializeObjectConstructor();
+
         $handlers = array(
+            new ObjectBasedCustomHandler($objectConstructor, $factory),
             new DateTimeHandler(),
             new ArrayCollectionHandler(),
             new AuthorListDeserializationHandler(),
@@ -375,10 +384,17 @@ class Article implements SerializationHandlerInterface, DeserializationHandlerIn
             return;
         }
 
-        $visited = true;
+        if ($visitor instanceof XmlDeserializationVisitor) {
+            $visited = true;
 
-        $this->element = key($data);
-        $this->value = reset($data);
+            $this->element = $data->getName();
+            $this->value = (string)$data;
+        } elseif ($visitor instanceof JsonDeserializationVisitor) {
+            $visited = true;
+
+            $this->element = key($data);
+            $this->value = reset($data);
+        }
 
         return $this;
     }