From bafd922f6006a3379440128ad52979bb6cffc143 Mon Sep 17 00:00:00 2001 From: ADmad Date: Fri, 27 Feb 2015 12:03:25 +0530 Subject: [PATCH] Add afterDeleteCommit event. --- src/ORM/Table.php | 11 ++++- tests/TestCase/ORM/TableTest.php | 72 ++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 1 deletion(-) diff --git a/src/ORM/Table.php b/src/ORM/Table.php index 97f31d401da..484c9eedf35 100644 --- a/src/ORM/Table.php +++ b/src/ORM/Table.php @@ -1598,7 +1598,15 @@ public function delete(EntityInterface $entity, $options = []) }; if ($options['atomic']) { - return $this->connection()->transactional($process); + $connection = $this->connection(); + $success = $connection->transactional($process); + if ($success && !$connection->inTransaction()) { + $this->dispatchEvent('Model.afterDeleteCommit', [ + 'entity' => $entity, + 'options' => $options + ]); + } + return $success; } return $process(); } @@ -2158,6 +2166,7 @@ public function implementedEvents() 'Model.afterSaveCommit' => 'afterSaveCommit', 'Model.beforeDelete' => 'beforeDelete', 'Model.afterDelete' => 'afterDelete', + 'Model.afterDeleteCommit' => 'afterDeleteCommit', 'Model.beforeRules' => 'beforeRules', 'Model.afterRules' => 'afterRules', ]; diff --git a/tests/TestCase/ORM/TableTest.php b/tests/TestCase/ORM/TableTest.php index 06fe1bb3d9c..824ada717e6 100644 --- a/tests/TestCase/ORM/TableTest.php +++ b/tests/TestCase/ORM/TableTest.php @@ -2465,11 +2465,83 @@ public function testDeleteCallbacks() ) )); + $mock->expects($this->at(4)) + ->method('dispatch') + ->with($this->logicalAnd( + $this->attributeEqualTo('_name', 'Model.afterDeleteCommit'), + $this->attributeEqualTo( + 'data', + ['entity' => $entity, 'options' => $options] + ) + )); + $table = TableRegistry::get('users', ['eventManager' => $mock]); $entity->isNew(false); $table->delete($entity, ['checkRules' => false]); } + /** + * Test afterDeleteCommit not called for non-atomic delete + * + * @return void + */ + public function testDeleteCallbacksNonAtomic() + { + $table = TableRegistry::get('users'); + + $data = $table->get(1); + $options = new \ArrayObject(['atomic' => false, 'checkRules' => false]); + + $called = false; + $listener = function ($e, $entity, $options) use ($data, &$called) { + $this->assertSame($data, $entity); + $called = true; + }; + $table->eventManager()->attach($listener, 'Model.afterDelete'); + + $calledAfterCommit = false; + $listenerAfterCommit = function ($e, $entity, $options) use ($data, &$calledAfterCommit) { + $calledAfterCommit = true; + }; + $table->eventManager()->attach($listenerAfterCommit, 'Model.afterDeleteCommit'); + + $table->delete($data, ['atomic' => false]); + $this->assertTrue($called); + $this->assertFalse($calledAfterCommit); + } + + /** + * Test that afterDeleteCommit is only triggered for primary table + * + * @return void + */ + public function testAfterDeleteCommitTriggeredOnlyForPrimaryTable() + { + $table = TableRegistry::get('authors'); + $table->hasOne('articles', [ + 'foreignKey' => 'author_id', + 'dependent' => true, + ]); + + $called = false; + $listener = function ($e, $entity, $options) use (&$called) { + $called = true; + }; + $table->eventManager()->attach($listener, 'Model.afterDeleteCommit'); + + $called2 = false; + $listener = function ($e, $entity, $options) use (&$called2) { + $called2 = true; + }; + $table->articles->eventManager()->attach($listener, 'Model.afterDeleteCommit'); + + $entity = $table->get(1); + $this->assertTrue($table->delete($entity)); + + $this->assertTrue($called); + $this->assertFalse($called2); + } + /** * Test delete beforeDelete can abort the delete. *