1

我有一堆 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 中是可能的吗?还是有其他东西可以提供该功能?

4

1 回答 1

2

你应该使用交易。例如:

$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();
  }
}
于 2013-07-20T20:01:43.353 回答