1
0
mirror of synced 2025-01-10 19:17:10 +03:00
doctrine2/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2790Test.php

78 lines
2.1 KiB
PHP
Raw Normal View History

2013-11-17 14:51:09 +04:00
<?php
namespace Doctrine\Tests\ORM\Functional\Ticket;
use Doctrine\Tests\Models\CMS\CmsUser;
use Doctrine\ORM\Event\OnFlushEventArgs;
use Doctrine\ORM\Events;
/**
* @group DDC-2790
*/
class DDC2790Test extends \Doctrine\Tests\OrmFunctionalTestCase
{
/**
* {@inheritDoc}
*/
protected function setUp()
{
$this->useModelSet('cms');
parent::setUp();
}
/**
* Verifies that entities scheduled for deletion are not treated as updated by UoW,
* even if their properties are changed after the remove() call
*/
public function testIssue()
{
$this->_em->getEventManager()->addEventListener(Events::onFlush, new OnFlushListener);
$entity = new CmsUser;
$entity->username = 'romanb';
$entity->name = 'Roman';
$qb = $this->_em->createQueryBuilder();
$qb->from(get_class($entity), 'c');
$qb->select("count(c)");
$initial = intval($qb->getQuery()->getSingleScalarResult());
$this->_em->persist($entity);
$this->_em->flush();
$this->_em->remove($entity);
// in Doctrine <2.5, this causes an UPDATE statement to be added before the DELETE statement
// (and consequently also triggers preUpdate/postUpdate for the entity in question)
$entity->name = 'Robin';
$this->_em->flush($entity);
$qb = $this->_em->createQueryBuilder();
$qb->from(get_class($entity), 'c');
$qb->select("count(c)");
$count = intval($qb->getQuery()->getSingleScalarResult());
$this->assertEquals($initial, $count);
}
}
class OnFlushListener
{
/**
* onFLush listener that tries to cancel deletions by calling persist if the entity is listed
* as updated in UoW
*/
public function onFlush(OnFlushEventArgs $args)
{
$em = $args->getEntityManager();
$uow = $em->getUnitOfWork();
$deletions = $uow->getScheduledEntityDeletions();
$updates = $uow->getScheduledEntityUpdates();
$undelete = array_intersect_key($deletions, $updates);
foreach ($undelete as $d)
{
$em->persist($d);
}
}
}