Skip to content

Commit

Permalink
Add afterDeleteCommit event.
Browse files Browse the repository at this point in the history
  • Loading branch information
ADmad committed Feb 27, 2015
1 parent cb230e6 commit bafd922
Show file tree
Hide file tree
Showing 2 changed files with 82 additions and 1 deletion.
11 changes: 10 additions & 1 deletion src/ORM/Table.php
Expand Up @@ -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();
}
Expand Down Expand Up @@ -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',
];
Expand Down
72 changes: 72 additions & 0 deletions tests/TestCase/ORM/TableTest.php
Expand Up @@ -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.
*
Expand Down

0 comments on commit bafd922

Please sign in to comment.