Удалить файл только при фиксации транзакции

У меня есть Attachment модель, которая хранит метаданные файла в MySQL и фактический файл в файловой системе. Я реализовал удаление с помощью методов обратного вызова:

public function beforeDelete($cascade = true) {
    $this->data = $this->findById($this->id);
    return parent::beforeDelete($cascade);
}

public function afterDelete() {
    $file = new File($this->data['Attachment']['path']);
    $file->delete();
}

Есть ли способ определить, существует ли открытая транзакция, и выполнить удаление файловой системы, только если такая транзакция будет зафиксирована? (Транзакция, конечно, обрабатывается в контроллере, который может даже не быть AttachmentsCrontroller но некоторые другие.)

1 ответ

Решение

Это уже немного сложно в CakePHP 3.x, где есть реальные события после того, как что-то было зафиксировано, и где объекты опций передаются на протяжении всего процесса сохранения / удаления, которые могут хранить информацию о транзакции, и даже там, где вы бы имели чтобы как-то вызвать такой процесс самостоятельно, если вы хотите вручную обернуть операцию сохранения / удаления в транзакции.

Например, вы можете попытаться реализовать выполнение транзакций в поведении, тогда ваши модели могут хранить ссылки на файлы, которые будут удалены в этом поведении. beforeDeleteи поведение может отправлять события на задействованные модели после того, как что-то зафиксировано, что-то вроде afterCommit, которые ваши модели могут слушать, а затем удалить файлы.

Другие вопросы по тегам