【问题标题】:Remove file only on transaction commit仅在事务提交时删除文件
【发布时间】:2018-06-27 09:36:07
【问题描述】:

我有一个Attachment 模型,它将文件元数据存储在 MySQL 中,并将实际文件存储在文件系统中。我已经用Callback Methods 实现了删除:

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,而是其他一些。)

【问题讨论】:

    标签: cakephp cakephp-2.9


    【解决方案1】:

    这在 CakePHP 3.x 中已经有点棘手了,在事情提交之后会有实际的事件,并且选项对象在整个保存/删除过程中传递,可以存储有关事务的信息,甚至在那里你如果您在事务中手动包装保存/删除操作,则必须以某种方式自己调用这样的过程。

    例如,您可以尝试在行为中以事务方式执行事物,然后您的模型可以存储对要在 beforeDelete 上的该行为中删除的文件的引用,并且该行为可以在事情发生后在相关模型上调度事件提交,类似于afterCommit,您的模型可以收听,然后删除文件。

    【讨论】:

      猜你喜欢
      • 2021-12-31
      • 2011-01-29
      • 2015-01-09
      • 1970-01-01
      • 2021-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多