Удалить файл только при фиксации транзакции - PullRequest
0 голосов
/ 27 июня 2018

У меня есть модель 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 Ответ

0 голосов
/ 27 июня 2018

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

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

...