Forráskód Böngészése

Merge pull request #1 from robocoder/doctrine-object-constructor-patch

Filter out non-identifiers from $data before calling find()
Johannes 12 éve
szülő
commit
1a2d7d1bd4

+ 21 - 13
src/JMS/Serializer/Construction/DoctrineObjectConstructor.php

@@ -22,6 +22,9 @@ use Doctrine\Common\Persistence\ManagerRegistry;
 use JMS\Serializer\VisitorInterface;
 use JMS\Serializer\Metadata\ClassMetadata;
 
+/**
+ * Doctrine object constructor for new (or existing) objects during deserialization.
+ */
 class DoctrineObjectConstructor implements ObjectConstructorInterface
 {
     private $managerRegistry;
@@ -30,8 +33,8 @@ class DoctrineObjectConstructor implements ObjectConstructorInterface
     /**
      * Constructor.
      *
-     * @param ManagerRegistry            $managerRegistry
-     * @param ObjectConstructorInterface $fallbackConstructor
+     * @param ManagerRegistry            $managerRegistry     Manager registry
+     * @param ObjectConstructorInterface $fallbackConstructor Fallback object constructor
      */
     public function __construct(ManagerRegistry $managerRegistry, ObjectConstructorInterface $fallbackConstructor)
     {
@@ -66,18 +69,23 @@ class DoctrineObjectConstructor implements ObjectConstructorInterface
             return $objectManager->getReference($metadata->name, $data);
         }
 
-        // Entity update, load it from database
-        $classMetadata         = $objectManager->getClassMetadata($metadata->name);
-        $identifierList        = $classMetadata->getIdentifierFieldNames();
-        $missingIdentifierList = array_filter(
-            $identifierList,
-            function ($identifier) use ($data) {
-                return !isset($data[$identifier]);
+        // Fallback to default constructor if missing identifier(s)
+        $classMetadata  = $objectManager->getClassMetadata($metadata->name);
+        $identifierList = array();
+
+        foreach ($classMetadata->getIdentifierFieldNames() as $name) {
+            if ( ! isset($data[$name])) {
+                return $this->fallbackConstructor->construct($visitor, $metadata, $data, $type);
             }
-        );
 
-        return (!$missingIdentifierList)
-            ? $objectManager->find($metadata->name, $data)
-            : $this->fallbackConstructor->construct($visitor, $metadata, $data, $type);
+            $identifierList[$name] = $data[$name];
+        }
+
+        // Entity update, load it from database
+        $object = $objectManager->find($metadata->name, $identifierList);
+
+        $objectManager->initializeObject($object);
+
+        return $object;
     }
 }