我有一个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
而是其他一些。)
答案 0 :(得分:1)
在CakePHP 3.x中,这已经有些棘手了,在提交事件之后会有实际事件,并且在整个保存/删除过程中传递选项对象,这些对象可以存储有关交易的信息,甚至在那里如果您要在事务中手动包装保存/删除操作,则必须以某种方式自己调用此过程。
例如,您可以尝试在一个行为中实现事务性执行事情,然后您的模型可以在该beforeDelete
上的行为中存储要删除的文件的引用,并且该行为可以在事件发生后在所涉及的模型上调度事件已提交,例如afterCommit
,您的模型可以侦听然后删除文件。