Skip to content

Commit 6d9b73d

Browse files
committed
Added the afterSave callback
1 parent 17c5818 commit 6d9b73d

File tree

2 files changed

+64
-1
lines changed

2 files changed

+64
-1
lines changed

Cake/ORM/Table.php

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -794,13 +794,20 @@ public function save(Entity $entity, array $options = []) {
794794
->values($data)
795795
->executeStatement();
796796

797+
$success = false;
797798
if ($statement->rowCount() > 0) {
798799
$primary = $this->primaryKey();
799800
$id = $statement->lastInsertId($this->table(), $primary);
800801
$entity->set($primary, $id);
802+
$success = $entity;
801803
}
802804

803-
return $entity;
805+
if ($success) {
806+
$event = new Event('Model.afterSave', $this, compact('entity', 'options'));
807+
$this->getEventManager()->dispatch($event);
808+
}
809+
810+
return $success;
804811
}
805812

806813
/**

Cake/Test/TestCase/ORM/TableTest.php

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1080,4 +1080,60 @@ public function testBeforeSaveStopEvent() {
10801080
$this->assertNull($row);
10811081
}
10821082

1083+
/**
1084+
* Asserts that afterSave callback is called on successful save
1085+
*
1086+
* @return void
1087+
*/
1088+
public function testAfterSave() {
1089+
$table = Table::build('users');
1090+
$data = new \Cake\ORM\Entity([
1091+
'username' => 'superuser',
1092+
'created' => new \DateTime('2013-10-10 00:00'),
1093+
'updated' => new \DateTime('2013-10-10 00:00')
1094+
]);
1095+
1096+
$called = false;
1097+
$listener = function($e, $entity, $options) use ($data, &$called) {
1098+
$this->assertSame($data, $entity);
1099+
$called = true;
1100+
};
1101+
$table->getEventManager()->attach($listener, 'Model.afterSave');
1102+
$this->assertSame($data, $table->save($data));
1103+
$this->assertEquals($data->id, 5);
1104+
$this->assertTrue($called);
1105+
}
1106+
1107+
/**
1108+
* Asserts that afterSave callback not is called on unsuccessful save
1109+
*
1110+
* @return void
1111+
*/
1112+
public function testAfterSaveNotCalled() {
1113+
$table = $this->getMock('\Cake\ORM\Table', ['_buildQuery'], [['table' => 'users']]);
1114+
$query = $this->getMock('\Cake\ORM\Query', ['executeStatement'], [null, $table]);
1115+
$statement = $this->getMock('\Cake\Database\Statement\StatementDecorator');
1116+
$data = new \Cake\ORM\Entity([
1117+
'username' => 'superuser',
1118+
'created' => new \DateTime('2013-10-10 00:00'),
1119+
'updated' => new \DateTime('2013-10-10 00:00')
1120+
]);
1121+
1122+
$table->expects($this->once())->method('_buildQuery')
1123+
->will($this->returnValue($query));
1124+
1125+
$query->expects($this->once())->method('executeStatement')
1126+
->will($this->returnValue($statement));
1127+
1128+
$statement->expects($this->once())->method('rowCount')->will($this->returnValue(0));
1129+
1130+
$called = false;
1131+
$listener = function($e, $entity, $options) use ($data, &$called) {
1132+
$called = true;
1133+
};
1134+
$table->getEventManager()->attach($listener, 'Model.afterSave');
1135+
$this->assertFalse($table->save($data));
1136+
$this->assertFalse($called);
1137+
}
1138+
10831139
}

0 commit comments

Comments
 (0)