2013-03-06 97 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; 
}