From 875912bffda24fc909bd8d8ecafede992c5ff9d9 Mon Sep 17 00:00:00 2001 From: Benjamin Eberlei Date: Sun, 5 Jun 2011 08:44:38 +0200 Subject: [PATCH] DDC-733 - Add UnitOfWork::initializeObject() method. --- lib/Doctrine/ORM/Proxy/ProxyFactory.php | 5 ++-- lib/Doctrine/ORM/UnitOfWork.php | 23 ++++++++++++++++++- .../ManyToManyBasicAssociationTest.php | 15 ++++++++++++ .../ORM/Functional/ReferenceProxyTest.php | 15 ++++++++++++ 4 files changed, 55 insertions(+), 3 deletions(-) diff --git a/lib/Doctrine/ORM/Proxy/ProxyFactory.php b/lib/Doctrine/ORM/Proxy/ProxyFactory.php index 23186d7aa..52a4791a9 100644 --- a/lib/Doctrine/ORM/Proxy/ProxyFactory.php +++ b/lib/Doctrine/ORM/Proxy/ProxyFactory.php @@ -269,7 +269,8 @@ class extends \ implements \Doctrine\ORM\Proxy\Proxy $this->_entityPersister = $entityPersister; $this->_identifier = $identifier; } - private function __load() + /** @private */ + public function __load() { if (!$this->__isInitialized__ && $this->_entityPersister) { $this->__isInitialized__ = true; @@ -279,7 +280,7 @@ class extends \ implements \Doctrine\ORM\Proxy\Proxy unset($this->_entityPersister, $this->_identifier); } } - + public function __sleep() diff --git a/lib/Doctrine/ORM/UnitOfWork.php b/lib/Doctrine/ORM/UnitOfWork.php index 90d3117e3..aa5309a7c 100644 --- a/lib/Doctrine/ORM/UnitOfWork.php +++ b/lib/Doctrine/ORM/UnitOfWork.php @@ -2335,7 +2335,28 @@ class UnitOfWork implements PropertyChangedListener { return $this->collectionUpdates; } - + + /** + * Helper method to initialize a lazy loading proxy or persistent collection. + * + * @param object + * @return void + */ + public function initializeObject($obj) + { + if ($obj instanceof Proxy) { + $obj->__load(); + } else if ($obj instanceof PersistentCollection) { + $obj->initialize(); + } + } + + /** + * Helper method to show an object as string. + * + * @param object $obj + * @return string + */ private static function objToStr($obj) { return method_exists($obj, '__toString') ? (string)$obj : get_class($obj).'@'.spl_object_hash($obj); diff --git a/tests/Doctrine/Tests/ORM/Functional/ManyToManyBasicAssociationTest.php b/tests/Doctrine/Tests/ORM/Functional/ManyToManyBasicAssociationTest.php index 62ba0c08a..c537b4c5f 100644 --- a/tests/Doctrine/Tests/ORM/Functional/ManyToManyBasicAssociationTest.php +++ b/tests/Doctrine/Tests/ORM/Functional/ManyToManyBasicAssociationTest.php @@ -342,4 +342,19 @@ class ManyToManyBasicAssociationTest extends \Doctrine\Tests\OrmFunctionalTestCa $this->assertEquals('Developers_New1', $user->groups[0]->name); $this->assertEquals('Developers_New2', $user->groups[1]->name); } + + /** + * @group DDC-733 + */ + public function testInitializePersistentCollection() + { + $user = $this->addCmsUserGblancoWithGroups(2); + $this->_em->clear(); + + $user = $this->_em->find(get_class($user), $user->id); + + $this->assertFalse($user->groups->isInitialized(), "Pre-condition: lazy collection"); + $this->_em->getUnitOfWork()->initializeObject($user->groups); + $this->assertTrue($user->groups->isInitialized(), "Collection should be initialized after calling UnitOfWork::initializeObject()"); + } } diff --git a/tests/Doctrine/Tests/ORM/Functional/ReferenceProxyTest.php b/tests/Doctrine/Tests/ORM/Functional/ReferenceProxyTest.php index 3e66e0b12..9fcb90a5e 100644 --- a/tests/Doctrine/Tests/ORM/Functional/ReferenceProxyTest.php +++ b/tests/Doctrine/Tests/ORM/Functional/ReferenceProxyTest.php @@ -97,4 +97,19 @@ class ReferenceProxyTest extends \Doctrine\Tests\OrmFunctionalTestCase $this->assertTrue($clone->isCloned); $this->assertFalse($entity->isCloned); } + + /** + * @group DDC-733 + */ + public function testInitializeProxy() + { + $id = $this->createProduct(); + + /* @var $entity Doctrine\Tests\Models\ECommerce\ECommerceProduct */ + $entity = $this->_em->getReference('Doctrine\Tests\Models\ECommerce\ECommerceProduct' , $id); + + $this->assertFalse($entity->__isInitialized__, "Pre-Condition: Object is unitialized proxy."); + $this->_em->getUnitOfWork()->initializeObject($entity); + $this->assertTrue($entity->__isInitialized__, "Should be initialized after called UnitOfWork::initializeObject()"); + } }