在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(),这是否重要;在开头还是最后归还?
答案 0 :(得分:10)
这取决于你想做什么。
你应该知道beforeSave和beforeValidate方法可以通过返回true或false来影响保存/验证的进一步过程,无论是afterSave还是afterValidate - 都不能。您还应该知道,您不仅可以使用attachEventHandler方法附加一个事件处理程序,还可以使用任意数量的事件处理程序。因此,考虑到这一点,当您有多个事件处理程序时,调用父函数的位置在beforeSave和beforeValidate方法的情况下很重要。在其他情况下,它没有。
例如,您的模型中有beforeSave()处理程序,并且您还在另一个类中订阅了此事件(它都基于Observer pattern,我建议您阅读它以了解更多事件深)。 当您实现beforeSave()方法时,必须调用parent :: beforeSave()以使其他事件处理程序工作。如果您因某种原因决定不应保存模型,则可以选择是否运行其他事件处理程序。因此,您可以立即返回false,而不会让其他事件处理程序被触发(并节省一些资源)。
如果你认为你自己的beforeSave()处理程序比其他附加的处理程序重要,那么你应该首先调用parent :: beforeSave(),检查它的结果(就像你在第一个例子中所做的那样)并根据什么执行你的代码其他事件处理人员决定这样做。
通常你的模型中不会有其他事件处理程序(如果你有,你可能应该自己理解你的问题),所以你总是可以在return语句中调用parent方法,就像你在上一个例子中一样。如果您想中断保存或验证,请返回false。