是否可以在Doctrine_Record'post'钩子中回滚事务?

时间:2011-10-29 14:09:19

标签: php doctrine

是否可以从各种Doctrine_Record'post'钩子中回滚整个事务? I.E.来自postInsert(),postUpdate(),postSave()等

我正在使用Doctrine 1.2,并且从文档和API中不清楚如何执行此操作。

1 个答案:

答案 0 :(得分:1)

查看文档很清楚,Doctrine_Event是你最好的起点,因为它被传递给了事件处理程序。基本上你必须得到一个Doctrine_Connection对象(通过getInvoker()),然后尝试在其上调用回滚。

只有麻烦是getInvoker返回几种类型的对象中的一种,我不确定它们是否都支持回滚方法,因此您可能需要一些条件逻辑来确定是否可以从所有对象中回滚以及如何执行此操作针对不同的案例。

/**
 * getInvoker
 * returns the handler that invoked this event
 *
 * @return Doctrine_Connection|Doctrine_Connection_Statement|
 *         Doctrine_Connection_UnitOfWork|Doctrine_Transaction   the handler that invoked this event
 */
public function getInvoker()
{
    return $this->_invoker;
}

该文档显示了如何通过Doctrine_Connection开始,提交和回滚,这应该是最简单的起点。所以听众会看起来像:

class BlogPost extends Doctrine_Record
{
    public function postUpdate( $event )
    {
        $invoker = $event->getInvoker();
        switch(get_class($invoker)) {
            case 'Doctrine_Connection':
                $invoker->rollbakck();
                break;
            case 'Doctrine_Connection_Statement':
            case 'Doctrine_Collection_UnitOfWork':
            case 'Doctrine_Transaction':
                // todo can we rollback from these ?
                // if so figure out how :)
        }
    }
}