From 6d9b73d5743dc68c857c259da119b2ed9a681565 Mon Sep 17 00:00:00 2001 From: Jose Lorenzo Rodriguez Date: Thu, 24 Oct 2013 18:24:04 +0200 Subject: [PATCH] Added the afterSave callback --- Cake/ORM/Table.php | 9 ++++- Cake/Test/TestCase/ORM/TableTest.php | 56 ++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/Cake/ORM/Table.php b/Cake/ORM/Table.php index 0374e94f06b..05d2038e173 100644 --- a/Cake/ORM/Table.php +++ b/Cake/ORM/Table.php @@ -794,13 +794,20 @@ public function save(Entity $entity, array $options = []) { ->values($data) ->executeStatement(); + $success = false; if ($statement->rowCount() > 0) { $primary = $this->primaryKey(); $id = $statement->lastInsertId($this->table(), $primary); $entity->set($primary, $id); + $success = $entity; } - return $entity; + if ($success) { + $event = new Event('Model.afterSave', $this, compact('entity', 'options')); + $this->getEventManager()->dispatch($event); + } + + return $success; } /** diff --git a/Cake/Test/TestCase/ORM/TableTest.php b/Cake/Test/TestCase/ORM/TableTest.php index 50d6b316b0b..c9f577057aa 100644 --- a/Cake/Test/TestCase/ORM/TableTest.php +++ b/Cake/Test/TestCase/ORM/TableTest.php @@ -1080,4 +1080,60 @@ public function testBeforeSaveStopEvent() { $this->assertNull($row); } +/** + * Asserts that afterSave callback is called on successful save + * + * @return void + */ + public function testAfterSave() { + $table = Table::build('users'); + $data = new \Cake\ORM\Entity([ + 'username' => 'superuser', + 'created' => new \DateTime('2013-10-10 00:00'), + 'updated' => new \DateTime('2013-10-10 00:00') + ]); + + $called = false; + $listener = function($e, $entity, $options) use ($data, &$called) { + $this->assertSame($data, $entity); + $called = true; + }; + $table->getEventManager()->attach($listener, 'Model.afterSave'); + $this->assertSame($data, $table->save($data)); + $this->assertEquals($data->id, 5); + $this->assertTrue($called); + } + +/** + * Asserts that afterSave callback not is called on unsuccessful save + * + * @return void + */ + public function testAfterSaveNotCalled() { + $table = $this->getMock('\Cake\ORM\Table', ['_buildQuery'], [['table' => 'users']]); + $query = $this->getMock('\Cake\ORM\Query', ['executeStatement'], [null, $table]); + $statement = $this->getMock('\Cake\Database\Statement\StatementDecorator'); + $data = new \Cake\ORM\Entity([ + 'username' => 'superuser', + 'created' => new \DateTime('2013-10-10 00:00'), + 'updated' => new \DateTime('2013-10-10 00:00') + ]); + + $table->expects($this->once())->method('_buildQuery') + ->will($this->returnValue($query)); + + $query->expects($this->once())->method('executeStatement') + ->will($this->returnValue($statement)); + + $statement->expects($this->once())->method('rowCount')->will($this->returnValue(0)); + + $called = false; + $listener = function($e, $entity, $options) use ($data, &$called) { + $called = true; + }; + $table->getEventManager()->attach($listener, 'Model.afterSave'); + $this->assertFalse($table->save($data)); + $this->assertFalse($called); + } + }