Browse Source

prevents serialization of initialized proxy properties

Johannes M. Schmitt 13 years ago
parent
commit
a1fbc4b0e6

+ 8 - 4
Serializer/Handler/DoctrineOrmProxyHandler.php

@@ -26,14 +26,18 @@ class DoctrineOrmProxyHandler implements SerializationHandlerInterface
 {
     public function serialize(VisitorInterface $visitor, $data, $type, &$handled)
     {
-        if ($data instanceof Proxy && !$data->__isInitialized__) {
+        if ($data instanceof Proxy && (!$data->__isInitialized__ || get_class($data) === $type)) {
             $handled = true;
 
-            $data->__load();
-            $visitor->getNavigator()->detachObject($data);
+            if (!$data->__isInitialized__) {
+                $data->__load();
+            }
+
+            $navigator = $visitor->getNavigator();
+            $navigator->detachObject($data);
 
             // pass the parent class not to load the metadata for the proxy class
-            return $visitor->getNavigator()->accept($data, get_parent_class($data), $visitor);
+            return $navigator->accept($data, get_parent_class($data), $visitor);
         }
 
         return null;

+ 12 - 3
Tests/Serializer/BaseSerializationTest.php

@@ -19,11 +19,8 @@
 namespace JMS\SerializerBundle\Tests\Serializer;
 
 use JMS\SerializerBundle\Tests\Fixtures\CurrencyAwareOrder;
-
 use JMS\SerializerBundle\Tests\Fixtures\CurrencyAwarePrice;
-
 use JMS\SerializerBundle\Tests\Fixtures\Order;
-
 use Symfony\Component\Yaml\Inline;
 use JMS\SerializerBundle\Serializer\YamlSerializationVisitor;
 use Doctrine\Common\Collections\ArrayCollection;
@@ -347,6 +344,18 @@ abstract class BaseSerializationTest extends \PHPUnit_Framework_TestCase
         $this->assertEquals($this->getContent('orm_proxy'), $this->serialize($object));
     }
 
+    public function testInitializedDoctrineProxy()
+    {
+        if (!class_exists('Doctrine\ORM\Version')) {
+            $this->markTestSkipped('Doctrine is not available.');
+        }
+
+        $object = new SimpleObjectProxy('foo', 'bar');
+        $object->__load();
+
+        $this->assertEquals($this->getContent('orm_proxy'), $this->serialize($object));
+    }
+
     abstract protected function getContent($key);
     abstract protected function getFormat();