Если вам нужно инициировать что-то только тогда, когда транзакция фактически была зафиксирована, вам нужно поставить ее в очередь в postDelete, а затем выполнить в обработчике postTransactionCommit
$conn = Doctrine_Manager::connection(...);
$conn->addListener(new TransactionCommitListener());
class TransactionCommitListener extends Doctrine_EventListener {
public function postTransactionCommit(Doctrine_Event $event) {
if ($event->getInvoker()->getConnection()->getTransactionLevel() == 1) {
// do your filesystem deletes here
}
}
public function postTransactionRollback(Doctrine_Event $event) {
// clear your delete queue here
}
}
Обычно я использовал одиночный кодхранить очередь и извлекать ее статически.Если вы используете несколько подключений, вам нужно иметь несколько очередей.
Приведенный выше обработчик фиксации запускается только для самой внешней фиксации, то есть, как Doctrine работает с mysql, так как он не предоставляет вложенные транзакции.Если ваша база данных предоставляет вложенные транзакции, и доктрина поддерживает это, вам может потребоваться изменить это.