2013-01-06 16 views
3

在Yii文檔中,我們經常可以閱讀「確保您調用父實現,以便正確地引發事件。」對於beforeSave,beforeValidate,afterSave ...如何在beforeSave,beforeValidate,afterSave等中正確調用parent ::

在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();在開始還是迴歸到底?

回答

10

這取決於你想要做什麼。

您應該知道beforeSave和beforeValidate方法可以通過返回true或false影響進一步的保存/驗證過程,無論是afterSave還是afterValidate - 都不能。您還應該知道,您可以不只有一個事件處理程序,而是使用attachEventHandler方法附加的任意數量的事件處理程序。所以,考慮到這一點,當你有多個事件處理程序時,你調用父函數的地方對beforeSave和beforeValidate方法來說很重要。在其他情況下,它不會。例如,你在你的模型中有beforeSave()處理程序,並且你也在另一個類中訂閱了這個事件(它全部基於Observer pattern,我建議你閱讀它以更深入地理解事件)。 當你實現beforeSave()方法時,你需要調用parent :: beforeSave()來使其他事件處理函數工作。如果你決定不保存你的模型出於某種原因,你可以選擇 - 是否運行其他事件處理程序。所以你可以在不讓其他事件處理器被觸發的情況下立即返回false(並且可以節省一些資源)。

如果你認爲你自己的beforeSave()處理程序不如其他附加處理程序重要,那麼你應該首先調用parent :: beforeSave(),檢查它的結果(就像你在第一個例子中那樣)並且根據其他事件處理程序決定做什麼。

通常情況下,模型中不會有額外的事件處理程序(如果有的話,您可能應該自己理解您的問題),因此您可以隨時在return語句中調用父方法,就像在上一個例子中一樣。如果您想中斷保存或驗證,請改爲返回false。

相關問題