Merge branch 'hotfix/#470-DDC-54-postLoad-deferred-event-triggering-tests'
Close #470
This commit is contained in:
commit
14c3adbec0
@ -184,6 +184,14 @@ the life-time of their registered entities.
|
||||
invoked, after all references to entities have been removed from the unit of
|
||||
work. This event is not a lifecycle callback.
|
||||
|
||||
.. warning::
|
||||
|
||||
Note that, when using ``Doctrine\ORM\AbstractQuery#iterate()``, ``postLoad``
|
||||
events will be executed immediately after objects are being hydrated, and therefore
|
||||
associations are not guaranteed to be initialized. It is not safe to combine
|
||||
usage of ``Doctrine\ORM\AbstractQuery#iterate()`` and ``postLoad`` event
|
||||
handlers.
|
||||
|
||||
.. warning::
|
||||
|
||||
Note that the postRemove event or any events triggered after an entity removal
|
||||
|
@ -24,6 +24,9 @@ use PDO;
|
||||
use Doctrine\ORM\Mapping\ClassMetadata;
|
||||
use Doctrine\ORM\PersistentCollection;
|
||||
use Doctrine\ORM\Query;
|
||||
use Doctrine\ORM\Events;
|
||||
use Doctrine\ORM\Event\LifecycleEventArgs;
|
||||
use Doctrine\ORM\Event\PostLoadEventDispatcher;
|
||||
use Doctrine\Common\Collections\ArrayCollection;
|
||||
use Doctrine\ORM\Proxy\Proxy;
|
||||
|
||||
@ -522,6 +525,10 @@ class ObjectHydrator extends AbstractHydrator
|
||||
$resultKey = $index;
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($this->_hints[Query::HINT_INTERNAL_ITERATION]) && $this->_hints[Query::HINT_INTERNAL_ITERATION]) {
|
||||
$this->_uow->hydrationComplete();
|
||||
}
|
||||
}
|
||||
|
||||
if ( ! isset($resultKey) ) {
|
||||
|
@ -144,5 +144,9 @@ class SimpleObjectHydrator extends AbstractHydrator
|
||||
$entity = $uow->createEntity($entityName, $data, $this->_hints);
|
||||
|
||||
$result[] = $entity;
|
||||
|
||||
if (isset($this->_hints[Query::HINT_INTERNAL_ITERATION]) && $this->_hints[Query::HINT_INTERNAL_ITERATION]) {
|
||||
$this->_uow->hydrationComplete();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
namespace Doctrine\Tests\ORM\Functional;
|
||||
use Doctrine\ORM\Event\PreUpdateEventArgs;
|
||||
use Doctrine\ORM\Query;
|
||||
|
||||
class LifecycleCallbackTest extends \Doctrine\Tests\OrmFunctionalTestCase
|
||||
{
|
||||
@ -150,6 +151,116 @@ class LifecycleCallbackTest extends \Doctrine\Tests\OrmFunctionalTestCase
|
||||
$this->assertTrue($e2->prePersistCallbackInvoked);
|
||||
}
|
||||
|
||||
/**
|
||||
* @group DDC-54
|
||||
* @group DDC-3005
|
||||
*/
|
||||
public function testCascadedEntitiesLoadedInPostLoad()
|
||||
{
|
||||
$e1 = new LifecycleCallbackTestEntity();
|
||||
$e2 = new LifecycleCallbackTestEntity();
|
||||
|
||||
$c = new LifecycleCallbackCascader();
|
||||
$this->_em->persist($c);
|
||||
|
||||
$c->entities[] = $e1;
|
||||
$c->entities[] = $e2;
|
||||
$e1->cascader = $c;
|
||||
$e2->cascader = $c;
|
||||
|
||||
$this->_em->flush();
|
||||
$this->_em->clear();
|
||||
|
||||
$dql = <<<'DQL'
|
||||
SELECT
|
||||
e, c
|
||||
FROM
|
||||
Doctrine\Tests\ORM\Functional\LifecycleCallbackTestEntity AS e
|
||||
LEFT JOIN
|
||||
e.cascader AS c
|
||||
WHERE
|
||||
e.id IN (%s, %s)
|
||||
DQL;
|
||||
|
||||
$entities = $this
|
||||
->_em
|
||||
->createQuery(sprintf($dql, $e1->getId(), $e2->getId()))
|
||||
->getResult();
|
||||
|
||||
$this->assertTrue(current($entities)->postLoadCallbackInvoked);
|
||||
$this->assertTrue(current($entities)->postLoadCascaderNotNull);
|
||||
$this->assertTrue(current($entities)->cascader->postLoadCallbackInvoked);
|
||||
$this->assertEquals(current($entities)->cascader->postLoadEntitiesCount, 2);
|
||||
}
|
||||
|
||||
/**
|
||||
* @group DDC-54
|
||||
* @group DDC-3005
|
||||
*/
|
||||
public function testCascadedEntitiesNotLoadedInPostLoadDuringIteration()
|
||||
{
|
||||
$e1 = new LifecycleCallbackTestEntity();
|
||||
$e2 = new LifecycleCallbackTestEntity();
|
||||
|
||||
$c = new LifecycleCallbackCascader();
|
||||
$this->_em->persist($c);
|
||||
|
||||
$c->entities[] = $e1;
|
||||
$c->entities[] = $e2;
|
||||
$e1->cascader = $c;
|
||||
$e2->cascader = $c;
|
||||
|
||||
$this->_em->flush();
|
||||
$this->_em->clear();
|
||||
|
||||
$dql = <<<'DQL'
|
||||
SELECT
|
||||
e, c
|
||||
FROM
|
||||
Doctrine\Tests\ORM\Functional\LifecycleCallbackTestEntity AS e
|
||||
LEFT JOIN
|
||||
e.cascader AS c
|
||||
WHERE
|
||||
e.id IN (%s, %s)
|
||||
DQL;
|
||||
|
||||
$result = $this
|
||||
->_em
|
||||
->createQuery(sprintf($dql, $e1->getId(), $e2->getId()))
|
||||
->iterate();
|
||||
|
||||
foreach ($result as $entity) {
|
||||
$this->assertTrue($entity[0]->postLoadCallbackInvoked);
|
||||
$this->assertFalse($entity[0]->postLoadCascaderNotNull);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* @group DDC-54
|
||||
* @group DDC-3005
|
||||
*/
|
||||
public function testCascadedEntitiesNotLoadedInPostLoadDuringIterationWithSimpleObjectHydrator()
|
||||
{
|
||||
$this->_em->persist(new LifecycleCallbackTestEntity());
|
||||
$this->_em->persist(new LifecycleCallbackTestEntity());
|
||||
|
||||
$this->_em->flush();
|
||||
$this->_em->clear();
|
||||
|
||||
$result = $this
|
||||
->_em
|
||||
->createQuery('SELECT e FROM Doctrine\Tests\ORM\Functional\LifecycleCallbackTestEntity AS e')
|
||||
->iterate(null, Query::HYDRATE_SIMPLEOBJECT);
|
||||
|
||||
foreach ($result as $entity) {
|
||||
$this->assertTrue($entity[0]->postLoadCallbackInvoked);
|
||||
$this->assertFalse($entity[0]->postLoadCascaderNotNull);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public function testLifecycleCallbacksGetInherited()
|
||||
{
|
||||
$childMeta = $this->_em->getClassMetadata(__NAMESPACE__ . '\LifecycleCallbackChildEntity');
|
||||
@ -282,7 +393,7 @@ class LifecycleCallbackTestEntity
|
||||
public $prePersistCallbackInvoked = false;
|
||||
public $postPersistCallbackInvoked = false;
|
||||
public $postLoadCallbackInvoked = false;
|
||||
|
||||
public $postLoadCascaderNotNull = false;
|
||||
public $preFlushCallbackInvoked = false;
|
||||
|
||||
/**
|
||||
@ -322,6 +433,7 @@ class LifecycleCallbackTestEntity
|
||||
/** @PostLoad */
|
||||
public function doStuffOnPostLoad() {
|
||||
$this->postLoadCallbackInvoked = true;
|
||||
$this->postLoadCascaderNotNull = isset($this->cascader);
|
||||
}
|
||||
|
||||
/** @PreUpdate */
|
||||
@ -336,11 +448,15 @@ class LifecycleCallbackTestEntity
|
||||
}
|
||||
|
||||
/**
|
||||
* @Entity
|
||||
* @Entity @HasLifecycleCallbacks
|
||||
* @Table(name="lc_cb_test_cascade")
|
||||
*/
|
||||
class LifecycleCallbackCascader
|
||||
{
|
||||
/* test stuff */
|
||||
public $postLoadCallbackInvoked = false;
|
||||
public $postLoadEntitiesCount = 0;
|
||||
|
||||
/**
|
||||
* @Id @Column(type="integer")
|
||||
* @GeneratedValue(strategy="AUTO")
|
||||
@ -356,6 +472,12 @@ class LifecycleCallbackCascader
|
||||
{
|
||||
$this->entities = new \Doctrine\Common\Collections\ArrayCollection();
|
||||
}
|
||||
|
||||
/** @PostLoad */
|
||||
public function doStuffOnPostLoad() {
|
||||
$this->postLoadCallbackInvoked = true;
|
||||
$this->postLoadEntitiesCount = count($this->entities);
|
||||
}
|
||||
}
|
||||
|
||||
/** @MappedSuperclass @HasLifecycleCallbacks */
|
||||
|
Loading…
Reference in New Issue
Block a user