2013-03-06 94 views
1

我已經閱讀了關於如何創建CWebUser的子類的教程,並按照說明操作。這些路徑都可以工作,並且代碼正在進入正確的方法,但是從我的getter返回的值始終爲零。Yii擴展用戶似乎沒有保留額外的實例變量

class PersonUser extends CWebUser { 

    // Store model to not repeat query. 
    private $_person; 

    // Load user model. 
    public function loadPerson($id=null, $duration=0) 
    { 
    $this->login($id,$duration); 
    $this->_person=Person::model()->findByPk(Yii::app()->user->id); 
    } 

    public function getPerson() 
    { 
    return $this->_person; 
    //return Person::model()->findByPk($this->id); 
    } 
} 

如果我在loadPerson方法$this->_person->first_name呼應我設置_person後,我得到我所期望的價值。但是,在任何稍後的時間,如果我要求Yii::app()->user->person,則會調用getPerson()方法,但$this->_person現在爲空。我知道它進入那裏,如果我取消註釋下面的行,並讓它每次都查看這個人,它就會起作用。

這是Yii的問題嗎?我真的希望能夠緩存person對象,這樣我就可以在整個會話中引用它,而無需對數據庫進行更多的調用。我在想什麼?

回答

3

Yii沒有問題.... 根據文檔,CWebUser類標識預定義的變量「id」和「name」,它在整個會話中保持不變。任何額外的變量都應該和getState()和setState()方法一起使用。 「此外,CWebUser應該與IUserIdentity類一起使用,它實現了實際的認證算法。」

2

永遠不會調用方法loadUser()。而且裏面的login()調用也沒有意義。一個簡單的實現getPerson()將是。

private $_person = false; 
public function getPerson() 
{ 
    if($this->_person===false) 
     $this->_person = Person::model()->findByPk($this->id); 
    return $this->_person; 
}