2013-05-02 38 views
3

Yii中的ActiveRecord,是有可能設置在模型構造屬性,仍然有模型的isNewRecord財產仍然是真的嗎?Yii的模型isNewRecord虛假由於構造器

我有一個模型構造函數來創建一個私有屬性保留一個PHPPass密碼哈希實例。當我這樣做時,即使記錄是新建的,它也會將isNewRecord屬性設置爲false。

我試圖調用setIsNewRecord(真)在構造函數中,如果id屬性是大於零的解決辦法,但它似乎屬性不可在構造函數中。

,我不得不刪除構造,同時在需要phpass每個方法的聲明。

構造用戶模型:

public function __construct(){ 
    $this->phpass=new PasswordHash(Yii::app()->params['phpass']['iteration_count_log2'], Yii::app()->params['phpass']['portable_hashes']); 
} 

用戶模式init和isNewRecord條件控制器

public function actionEdit($id = null) 
{ 

    $myModel = new User();  
    echo $myModel->isNewRecord; //false due to constructor 
} 
+0

你可以告訴你嘗試過解決辦法: – 2013-05-02 18:39:13

回答

4

當ovveriding contstructor 請確保調用父類的構造。在ovveriding時總是調用父構造函數,除非你知道你在做什麼。

public function __construct($scenario = 'insert'){ 
    parent::__construct($scenario); 
    $this->phpass=new PasswordHash(Yii::app()->params['phpass']['iteration_count_log2'], Yii::app()->params['phpass']['portable_hashes']); 
} 

也phpass可以存儲爲靜態屬性,你不需要phpass的新實例爲每個活動記錄實例。

編輯:感謝@Kevin鏈接到question有關ovverding構造函數。

多一個重要注意添加:請記住將參數傳遞給構造函數。在Yii模型中,有$scenario參數,默認值爲insert。當你沒有傳遞這個參數時,如果你構造的是ovveride,總會有insert場景,並且不會有任何有關缺少參數的錯誤消息,因爲它有默認值。我更新了代碼$scenario

+1

作爲此答案的擴展,您可能需要查看以下問題的接受答案。它定義了用於調用parent :: __ contstruct()的選項,以及何時應該在代碼之前調用它,之後或以非常明確的方式調用它。 http://stackoverflow.com/questions/5119141/when-overriding-a-method-should-my-custom-code-come-before-or-after-superbase – Kevin 2013-05-02 20:43:19

3

一般來說,你應該避免重寫的Yii類的構造函數。大多數組件提供了一個init()方法,而不像您的示例中那樣是代碼的正確位置。

區別在於,對於應用程序組件,該對象將已應用所有配置。這與您的情況無關,但仍使用init()而不是__construct()