Ver Fonte

some discriminator related fixes

Johannes M. Schmitt há 12 anos atrás
pai
commit
a0c5d75865

+ 3 - 0
src/JMS/Serializer/Annotation/Discriminator.php

@@ -29,4 +29,7 @@ class Discriminator
 
     /** @var string */
     public $field = 'type';
+
+    /** @var boolean */
+    public $disabled = false;
 }

+ 3 - 0
src/JMS/Serializer/Metadata/ClassMetadata.php

@@ -49,6 +49,7 @@ class ClassMetadata extends MergeableClassMetadata
     public $customOrder;
     public $handlerCallbacks = array();
 
+    public $discriminatorDisabled = false;
     public $discriminatorBaseClass;
     public $discriminatorFieldName;
     public $discriminatorValue;
@@ -200,6 +201,7 @@ class ClassMetadata extends MergeableClassMetadata
             $this->accessorOrder,
             $this->customOrder,
             $this->handlerCallbacks,
+            $this->discriminatorDisabled,
             $this->discriminatorBaseClass,
             $this->discriminatorFieldName,
             $this->discriminatorValue,
@@ -218,6 +220,7 @@ class ClassMetadata extends MergeableClassMetadata
             $this->accessorOrder,
             $this->customOrder,
             $this->handlerCallbacks,
+            $this->discriminatorDisabled,
             $this->discriminatorBaseClass,
             $this->discriminatorFieldName,
             $this->discriminatorValue,

+ 5 - 1
src/JMS/Serializer/Metadata/Driver/AnnotationDriver.php

@@ -85,7 +85,11 @@ class AnnotationDriver implements DriverInterface
             } elseif ($annot instanceof AccessorOrder) {
                 $classMetadata->setAccessorOrder($annot->order, $annot->custom);
             } elseif ($annot instanceof Discriminator) {
-                $classMetadata->setDiscriminator($annot->field, $annot->map);
+                if ($annot->disabled) {
+                    $classMetadata->discriminatorDisabled = true;
+                } else {
+                    $classMetadata->setDiscriminator($annot->field, $annot->map);
+                }
             }
         }
 

+ 2 - 1
src/JMS/Serializer/Metadata/Driver/DoctrineTypeDriver.php

@@ -82,7 +82,8 @@ class DoctrineTypeDriver implements DriverInterface
             return $classMetadata;
         }
 
-        if (empty($classMetadata->discriminatorMap) && ! empty($doctrineMetadata->discriminatorMap)) {
+        if (empty($classMetadata->discriminatorMap) && ! $classMetadata->discriminatorDisabled
+                && ! empty($doctrineMetadata->discriminatorMap) && $doctrineMetadata->isRootEntity()) {
             $classMetadata->setDiscriminator(
                 $doctrineMetadata->discriminatorColumn['name'],
                 $doctrineMetadata->discriminatorMap

+ 3 - 1
src/JMS/Serializer/Metadata/Driver/XmlDriver.php

@@ -73,7 +73,9 @@ class XmlDriver extends AbstractFileDriver
             $discriminatorMap[(string) $entry->attributes()->value] = (string) $entry;
         }
 
-        if ( ! empty($discriminatorFieldName) || ! empty($discriminatorMap)) {
+        if ('true' === (string) $elem->attributes()->{'discriminator-disabled'}) {
+            $metadata->discriminatorDisabled = true;
+        } elseif ( ! empty($discriminatorFieldName) || ! empty($discriminatorMap)) {
             $metadata->setDiscriminator($discriminatorFieldName, $discriminatorMap);
         }
 

+ 11 - 7
src/JMS/Serializer/Metadata/Driver/YamlDriver.php

@@ -57,15 +57,19 @@ class YamlDriver extends AbstractFileDriver
         }
 
         if (isset($config['discriminator'])) {
-            if ( ! isset($config['discriminator']['field_name'])) {
-                throw new RuntimeException('The "field_name" attribute must be set for discriminators.');
-            }
+            if (isset($config['discriminator']['disabled']) && true === $config['discriminator']['disabled']) {
+                $metadata->discriminatorDisabled = true;
+            } else {
+                if ( ! isset($config['discriminator']['field_name'])) {
+                    throw new RuntimeException('The "field_name" attribute must be set for discriminators.');
+                }
 
-            if ( ! isset($config['discriminator']['map']) || ! is_array($config['discriminator']['map'])) {
-                throw new RuntimeException('The "map" attribute must be set, and be an array for discriminators.');
-            }
+                if ( ! isset($config['discriminator']['map']) || ! is_array($config['discriminator']['map'])) {
+                    throw new RuntimeException('The "map" attribute must be set, and be an array for discriminators.');
+                }
 
-            $metadata->setDiscriminator($config['discriminator']['field_name'], $config['discriminator']['map']);
+                $metadata->setDiscriminator($config['discriminator']['field_name'], $config['discriminator']['map']);
+            }
         }
 
         if (array_key_exists('virtual_properties', $config) ) {