Pārlūkot izejas kodu

check if the data implements SerializationHandlerInterface and in that case call it before going through the custom handlers (guess a similar change would need to be made for deserialization)

Lukas Kahwe Smith 13 gadi atpakaļ
vecāks
revīzija
0b19149345

+ 11 - 1
Serializer/GraphNavigator.php

@@ -21,6 +21,7 @@ namespace JMS\SerializerBundle\Serializer;
 use JMS\SerializerBundle\Metadata\ClassMetadata;
 use Metadata\MetadataFactoryInterface;
 use JMS\SerializerBundle\Serializer\Exclusion\ExclusionStrategyInterface;
+use JMS\SerializerBundle\Serializer\Handler\SerializationHandlerInterface;
 
 final class GraphNavigator
 {
@@ -67,6 +68,15 @@ final class GraphNavigator
                 $this->visiting->attach($data);
             }
 
+            $handled = false;
+
+            if ($data instanceof SerializationHandlerInterface) {
+                $rs = $data->serialize($visitor, $data, $type, $handled);
+                if ($handled) {
+                    return $rs;
+                }
+            }
+
              // try custom handler
             $rs = $visitor->visitUsingCustomHandler($data, $type, $handled);
             if ($handled) {
@@ -136,4 +146,4 @@ final class GraphNavigator
             }
         }
     }
-}
+}

+ 33 - 1
Tests/Serializer/BaseSerializationTest.php

@@ -24,6 +24,7 @@ use Symfony\Component\Form\FormError;
 use Symfony\Component\Validator\ConstraintViolation;
 use Symfony\Component\Validator\ConstraintViolationList;
 use JMS\SerializerBundle\Serializer\Handler\DeserializationHandlerInterface;
+use JMS\SerializerBundle\Serializer\Handler\SerializationHandlerInterface;
 use JMS\SerializerBundle\Tests\Fixtures\AuthorList;
 use JMS\SerializerBundle\Serializer\VisitorInterface;
 use JMS\SerializerBundle\Serializer\XmlDeserializationVisitor;
@@ -150,6 +151,13 @@ abstract class BaseSerializationTest extends \PHPUnit_Framework_TestCase
         $this->assertAttributeEquals($author, 'author', $deserialized);
     }
 
+    public function testArticle()
+    {
+        $article = new Article();
+
+        $this->assertEquals($this->getContent('article'), $this->serialize($article));
+    }
+
     /**
      * @group test
      */
@@ -328,4 +336,28 @@ class AuthorListDeserializationHandler implements DeserializationHandlerInterfac
 
         return $list;
     }
-}
+}
+
+class Article implements SerializationHandlerInterface
+{
+    public function serialize(VisitorInterface $visitor, $data, $type, &$visited)
+    {
+        if (!$data instanceof Article) {
+            return;
+        }
+
+        if ($visitor instanceof XmlSerializationVisitor) {
+            $visited = true;
+
+            if (null === $visitor->document) {
+                $visitor->document = $visitor->createDocument(null, null, false);
+            }
+
+            $visitor->document->appendChild($visitor->document->createElement('custom', 'serialized'));
+        } elseif ($visitor instanceof JsonSerializationVisitor) {
+            $visited = true;
+
+            $visitor->setRoot(array('custom' => 'serialized'));
+        }
+    }
+}

+ 2 - 1
Tests/Serializer/JsonSerializationTest.php

@@ -49,6 +49,7 @@ class JsonSerializationTest extends BaseSerializationTest
             $outputs['nested_form_errors'] = '{"errors":["This is the form error"],"children":{"bar":{"errors":["Error of the child form"]}}}';
             $outputs['constraint_violation'] = '{"property_path":"foo","message":"Message of violation"}';
             $outputs['constraint_violation_list'] = '[{"property_path":"foo","message":"Message of violation"},{"property_path":"bar","message":"Message of another violation"}]';
+            $outputs['article'] = '{"custom":"serialized"}';
         }
 
         if (!isset($outputs[$key])) {
@@ -62,4 +63,4 @@ class JsonSerializationTest extends BaseSerializationTest
     {
         return 'json';
     }
-}
+}

+ 2 - 0
Tests/Serializer/xml/article.xml

@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<custom>serialized</custom>