CakePHP模型回调,特别是在删除之前

时间:2010-07-16 02:30:44

标签: cakephp models

我在删除字段之前尝试执行某些逻辑。我有一些模型依赖于被删除的模型,我想确保与这些相关模型相关的图像文件也被删除,但我对模型回调如何工作有点困惑。

我知道我在模型类中定义了之前的Delete函数,但是如何访问当前模型中的数据或被删除的依赖模型?

function beforeDelete() {

}

我对如何使用这些回调感到有点困惑,而且我还没有看到任何好的文档。

修改 将此添加到父模型后,它似乎总是返回false。

function beforeDelete() {
    if ($this->DependentModel->find('count', array('conditions' => array('DependentModel.parent_id' => $this->id))) == 1){  
        return true;
    } else{
        return false;
    }
}

我应该明白我在这里要做什么。如果表中存在依赖模型的一个条目,则返回true并继续删除。我确保实际上有一个表条目依赖于被删除的对象。当我执行删除操作时,它总是返回false。这是怎么回事?

1 个答案:

答案 0 :(得分:9)

使用回调时,您可以参考您要扩展的类的API来检查它接受的参数。您的实现应至少接受与您重写的方法相同的参数。

例如,Model::beforeDelete的实现方式如下:

/**
 * Called before every deletion operation.
 *
 * @param boolean $cascade If true records that depend on this record will also be deleted
 * @return boolean True if the operation should continue, false if it should abort
 * @link http://book.cakephp.org/2.0/en/models/callback-methods.html#beforedelete
 */
    public function beforeDelete($cascade = true) {
        return true;
    }

此外,ModelBehavior::beforeDelete也是这样实现的(即在进行行为时):

/**
 * Before delete is called before any delete occurs on the attached model, but after the model's
 * beforeDelete is called.  Returning false from a beforeDelete will abort the delete.
 *
 * @param Model $model Model using this behavior
 * @param boolean $cascade If true records that depend on this record will also be deleted
 * @return mixed False if the operation should abort. Any other result will continue.
 */
    public function beforeDelete(Model $model, $cascade = true) {
        return true;
    }

接下来,了解保存到模型并传入控制器数据(即控制器中的$this->data)时数据为set to the model(即$this->data非常有用。在模型中)。 [这发生在Model::save()期间,目前正在line 1225上。]

对于第一个示例,您可以使用$this访问模型,在第二个示例中,您可以使用$model访问模型(因为$this将是行为上下文)。因此,要获取数据,您需要使用$this->data$model->data。您还可以使用链接访问该模型的相关模型(即$this->RelatedModel$model->RelatedModel)。

当docblock注释状态时,$cascade会告诉您这是否是正在发生的级联删除(默认情况下为true),以防您的代码需要采取不同的操作时不是这样的;如果要中止保存操作,则该方法的实现应返回false(否则,在完成后返回true)。

CakePHP有Media plugin,它实现了this exact functionality,可用作参考。