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