如何在beforeSave,beforeValidate,afterSave等中正确调用parent :: in

时间:2013-01-06 15:06:23

标签: php yii

在Yii文档中,我们经常可以阅读“确保调用父实现,以便正确引发事件。” for beforeSave,beforeValidate,afterSave ...

在我见过的Yii博客教程中:

protected function beforeSave()
{
    if(parent::beforeSave())
    {
        ...
        return true;
    }
    else
        return false;
}

if-function是什么?

我也只是简单地看到了:

protected function afterSave()
{
    parent::afterSave();
    ...
}

protected function beforeValidate()
{
    ...
    return parent::beforeValidate();
}

为什么有时在if-function中包含parent :: function调用?
如果我只调用parent :: function(),这是否重要;在开头还是最后归还?

1 个答案:

答案 0 :(得分:10)

这取决于你想做什么。

你应该知道beforeSave和beforeValidate方法可以通过返回true或false来影响保存/验证的进一步过程,无论是afterSave还是afterValidate - 都不能。您还应该知道,您不仅可以使用attachEventHandler方法附加一个事件处理程序,还可以使用任意数量的事件处理程序。因此,考虑到这一点,当您有多个事件处理程序时,调用父函数的位置在beforeSave和beforeValidate方法的情况下很重要。在其他情况下,它没有。

例如,您的模型中有beforeSave()处理程序,并且您还在另一个类中订阅了此事件(它都基于Observer pattern,我建议您阅读它以了解更多事件深)。 当您实现beforeSave()方法时,必须调用parent :: beforeSave()以使其他事件处理程序工作。如果您因某种原因决定不应保存模型,则可以选择是否运行其他事件处理程序。因此,您可以立即返回false,而不会让其他事件处理程序被触发(并节省一些资源)。

如果你认为你自己的beforeSave()处理程序比其他附加的处理程序重要,那么你应该首先调用parent :: beforeSave(),检查它的结果(就像你在第一个例子中所做的那样)并根据什么执行你的代码其他事件处理人员决定这样做。

通常你的模型中不会有其他事件处理程序(如果你有,你可能应该自己理解你的问题),所以你总是可以在return语句中调用parent方法,就像你在上一个例子中一样。如果您想中断保存或验证,请返回false。

相关问题