From 720917f609381921db52622a9796b2c13a84647a Mon Sep 17 00:00:00 2001 From: nurikabe Date: Mon, 24 Mar 2014 11:16:31 -0400 Subject: [PATCH] Clone entities on delete to preserve ids --- Doctrine/Listener.php | 7 +++++-- Tests/Doctrine/AbstractListenerTest.php | 8 ++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/Doctrine/Listener.php b/Doctrine/Listener.php index c254513..43ac744 100644 --- a/Doctrine/Listener.php +++ b/Doctrine/Listener.php @@ -195,17 +195,20 @@ class Listener implements EventSubscriber $this->scheduledForUpdate[] = $entity; } else { // Delete if no longer indexable - $this->scheduledForDeletion[] = $entity; + $this->scheduledForDeletion[] = clone $entity; } } } + /** + * Delete objects preRemove instead of postRemove so that we have access to the id + */ public function preRemove(EventArgs $eventArgs) { $entity = $eventArgs->getEntity(); if ($entity instanceof $this->objectClass) { - $this->scheduledForDeletion[] = $entity; + $this->scheduledForDeletion[] = clone $entity; } } diff --git a/Tests/Doctrine/AbstractListenerTest.php b/Tests/Doctrine/AbstractListenerTest.php index a9eff66..8e49f24 100644 --- a/Tests/Doctrine/AbstractListenerTest.php +++ b/Tests/Doctrine/AbstractListenerTest.php @@ -133,7 +133,9 @@ abstract class ListenerTest extends \PHPUnit_Framework_TestCase $listener = $this->createListener($persister, get_class($entity), array()); $listener->preRemove($eventArgs); - $this->assertEquals($entity, current($listener->scheduledForDeletion)); + $scheduledClone = current($listener->scheduledForDeletion); + $this->assertEquals($entity, $scheduledClone); + $this->assertNotSame($entity, $scheduledClone); $persister->expects($this->once()) ->method('deleteMany') @@ -164,7 +166,9 @@ abstract class ListenerTest extends \PHPUnit_Framework_TestCase $listener = $this->createListener($persister, get_class($entity), array(), 'identifier'); $listener->preRemove($eventArgs); - $this->assertEquals($entity, current($listener->scheduledForDeletion)); + $scheduledClone = current($listener->scheduledForDeletion); + $this->assertEquals($entity, $scheduledClone); + $this->assertNotSame($entity, $scheduledClone); $persister->expects($this->once()) ->method('deleteMany')