仅在事务提交时删除文件
Remove file only on transaction commit
我有一个 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();
}
有没有一种方法可以确定是否有打开的事务并且只有在提交了这样的事务时才执行文件系统删除? (事务当然是在controller中处理的,controller甚至可能不是AttachmentsCrontroller
而是其他的。)
这在 CakePHP 3.x 中已经有点棘手了,其中在提交内容后会有实际事件,并且选项对象在整个 saving/delete 过程中传递,可以存储有关交易,即使在那里,如果您手动将 save/delete 操作包装在交易中,您也必须以某种方式自己调用这样的过程。
例如,您可以尝试在行为中以事务方式执行事物,然后您的模型可以存储对要在该行为中删除的文件的引用 beforeDelete
,并且该行为可以在涉及的模型上分派事件提交后,类似于 afterCommit
,您的模型可以收听然后删除文件。
我有一个 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();
}
有没有一种方法可以确定是否有打开的事务并且只有在提交了这样的事务时才执行文件系统删除? (事务当然是在controller中处理的,controller甚至可能不是AttachmentsCrontroller
而是其他的。)
这在 CakePHP 3.x 中已经有点棘手了,其中在提交内容后会有实际事件,并且选项对象在整个 saving/delete 过程中传递,可以存储有关交易,即使在那里,如果您手动将 save/delete 操作包装在交易中,您也必须以某种方式自己调用这样的过程。
例如,您可以尝试在行为中以事务方式执行事物,然后您的模型可以存储对要在该行为中删除的文件的引用 beforeDelete
,并且该行为可以在涉及的模型上分派事件提交后,类似于 afterCommit
,您的模型可以收听然后删除文件。