我有一堆Doctrine php对象,我正在调用像
这样的东西$myObj = $query->execute()->getFirst();
$myObj->setName('a new name');
$myObj->setAge('40');
$myObj->save();
...等 等...
在某些时候,如果遇到错误,我想恢复所有这些属性更改,因为我已经调用了save()函数并将新属性传播到数据库。
我想提出一种方法来存储对象的旧值以及调用哪个方法来还原它。类似的东西:
$undoCollection = array();
$undoObject = array();
$undoObject['revertFunction'] = $myObj->setName;
$undoObject['revertValue'] = 18;
array_push($undoCollection,$undoObject)
所以稍后,如果出现问题,我可以遍历$ undoCollection:
foreach($undoCollection as $undoObj)
{
$undoObj['revertFunction']($undoObj['revertValue']);
}
这是否可以在PHP中使用?或者还有其他可以提供该功能的东西吗?
答案 0 :(得分:2)
您应该使用transactions。 E.g:
$myObj = $query->fetchOne();
if ($myObj)
{
$conn = $myObj->getTable()->getConnection();
try
{
$conn->beginTransaction();
$myObj->setName('Asd')->save();
// do other stuff...
// if an exception is thrown before calling commit
// nothing in this try block will be saved
$conn->commit();
}
catch(Exception $e)
{
$conn->rollback();
}
}