Doctrine 1.2: Использование postDelete для удаления связанных файлов в файловой системе - с поддержкой транзакций - PullRequest
2 голосов
/ 01 ноября 2010

Этот вопрос является своего рода расширением этого вопроса:

Выполнить некоторую очистку при удалении записи в Symfony / Doctrine

Я делаю это, и этоработает нормально, за исключением одной проблемы: если удаление завершается неудачно и транзакция никогда не фиксируется, метод postDelete по-прежнему выполняется и файлы все равно удаляются.

Что было бы хорошим способом избежать этого?

1 Ответ

3 голосов
/ 03 июня 2011

Если вам нужно инициировать что-то только тогда, когда транзакция фактически была зафиксирована, вам нужно поставить ее в очередь в 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, так как он не предоставляет вложенные транзакции.Если ваша база данных предоставляет вложенные транзакции, и доктрина поддерживает это, вам может потребоваться изменить это.

...