Можно ли откатить транзакции в хуках 'post' Doctrine_Record? - PullRequest
2 голосов
/ 29 октября 2011

Можно ли откатить всю транзакцию из различных хуков 'post' Doctrine_Record? И.Е. из postInsert (), postUpdate (), postSave () и т. д.

Я использую Doctrine 1.2 и из документации и API не понятно, как это сделать.

1 Ответ

1 голос
/ 29 июня 2012

Просматривая документы, становится ясно, что 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 :)
        }
    }
}
...