Selaa lähdekoodia

Allow deserialization of polymorphic classes by class without specifying the type

Samuel Gordalina 12 vuotta sitten
vanhempi
commit
4c2a1e814d

+ 1 - 1
src/JMS/Serializer/GraphNavigator.php

@@ -180,7 +180,7 @@ final class GraphNavigator
                 /** @var $metadata ClassMetadata */
                 $metadata = $this->metadataFactory->getMetadataForClass($type['name']);
 
-                if ($context instanceof DeserializationContext && ! empty($metadata->discriminatorMap)) {
+                if ($context instanceof DeserializationContext && ! empty($metadata->discriminatorMap) && $type['name'] === $metadata->discriminatorBaseClass) {
                     $metadata = $this->resolveMetadata($context, $data, $metadata);
                 }
 

+ 9 - 0
tests/JMS/Serializer/Tests/Serializer/BaseSerializationTest.php

@@ -685,6 +685,15 @@ abstract class BaseSerializationTest extends \PHPUnit_Framework_TestCase
                 ),
                 'Class is resolved correctly when least supertype is used.'
             );
+
+            $this->assertEquals(
+                new Car(5),
+                $this->deserialize(
+                    $this->getContent('car_without_type'),
+                    'JMS\Serializer\Tests\Fixtures\Discriminator\Car'
+                ),
+                'Class is resolved correctly when concrete sub-class is used and no type is defined.'
+            );
         }
     }
 

+ 1 - 0
tests/JMS/Serializer/Tests/Serializer/JsonSerializationTest.php

@@ -86,6 +86,7 @@ class JsonSerializationTest extends BaseSerializationTest
             $outputs['date_time'] = '"2011-08-30T00:00:00+0000"';
             $outputs['date_interval'] = '"PT45M"';
             $outputs['car'] = '{"km":5,"type":"car"}';
+            $outputs['car_without_type'] = '{"km":5}';
         }
 
         if (!isset($outputs[$key])) {

+ 4 - 0
tests/JMS/Serializer/Tests/Serializer/xml/car_without_type.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<result>
+  <km>5</km>
+</result>

+ 1 - 0
tests/JMS/Serializer/Tests/Serializer/yml/car_without_type.yml

@@ -0,0 +1 @@
+km: 5