4

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

在 Yii 博客教程中,我看到了:

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

if 函数是怎么回事?

我也只是简单地看到:

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

和:

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

为什么有时将 parent::function 调用包装在 if 函数中?
如果我只调用 parent::function(); 有关系吗?一开始还是最后归还?

4

1 回答 1

10

这取决于你想做什么。

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

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

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

通常,您的模型中不会有额外的事件处理程序(如果有,您可能应该自己理解您的问题),因此您始终可以在 return 语句中调用父方法,就像在上一个示例中一样。如果您想中断保存或验证,请改为返回 false。

于 2013-01-06T15:54:46.347 回答