Skip to content

Commit 720f42d

Browse files
committed
Clean primary entity after "Model.afterSaveCommit" is triggered.
Previously primary entity was being cleaned too early and callbacks for Model.afterSaveCommit become useless if one wanted to acccess original state.
1 parent df1b9b8 commit 720f42d

File tree

2 files changed

+7
-8
lines changed

2 files changed

+7
-8
lines changed

src/ORM/Table.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1502,6 +1502,7 @@ public function save(EntityInterface $entity, $options = [])
15021502
$this->dispatchEvent('Model.afterSaveCommit', compact('entity', 'options'));
15031503
}
15041504
if ($options['atomic'] || $options['_primary']) {
1505+
$entity->clean();
15051506
$entity->isNew(false);
15061507
$entity->source($this->registryAlias());
15071508
}
@@ -1606,8 +1607,8 @@ protected function _onSaveSuccess($entity, $options)
16061607
throw new RolledbackTransactionException(['table' => get_class($this)]);
16071608
}
16081609

1609-
$entity->clean();
16101610
if (!$options['atomic'] && !$options['_primary']) {
1611+
$entity->clean();
16111612
$entity->isNew(false);
16121613
$entity->source($this->registryAlias());
16131614
}

tests/TestCase/ORM/TableTest.php

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2209,11 +2209,9 @@ public function testBeforeSaveStopEvent()
22092209
public function testAfterSave()
22102210
{
22112211
$table = TableRegistry::get('users');
2212-
$data = new \Cake\ORM\Entity([
2213-
'username' => 'superuser',
2214-
'created' => new Time('2013-10-10 00:00'),
2215-
'updated' => new Time('2013-10-10 00:00')
2216-
]);
2212+
$data = $table->get(1);
2213+
2214+
$data->username = 'newusername';
22172215

22182216
$called = false;
22192217
$listener = function ($e, $entity, $options) use ($data, &$called) {
@@ -2226,13 +2224,13 @@ public function testAfterSave()
22262224
$calledAfterCommit = false;
22272225
$listenerAfterCommit = function ($e, $entity, $options) use ($data, &$calledAfterCommit) {
22282226
$this->assertSame($data, $entity);
2229-
$this->assertFalse($entity->dirty());
2227+
$this->assertTrue($entity->dirty());
2228+
$this->assertNotSame($data->get('username'), $data->getOriginal('username'));
22302229
$calledAfterCommit = true;
22312230
};
22322231
$table->eventManager()->on('Model.afterSaveCommit', $listenerAfterCommit);
22332232

22342233
$this->assertSame($data, $table->save($data));
2235-
$this->assertEquals($data->id, self::$nextUserId);
22362234
$this->assertTrue($called);
22372235
$this->assertTrue($calledAfterCommit);
22382236
}

0 commit comments

Comments
 (0)