Yii扩展用户似乎没有保留额外的实例变量

时间:2013-03-06 06:00:45

标签: php yii

我已阅读有关如何创建CWebUser子类的教程并按照说明操作。所有路径都有效,代码进入正确的方法,但是我的getter返回的值总是为零。

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);
  }
}

如果在设置$this->_person->first_name后我在loadPerson方法_person中回显,我得到了我期望的值。但是,在以后的某个时间,如果我要求Yii::app()->user->person,则会调用getPerson()方法,但$this->_person现在为空。我知道它会进入那里,如果我取消注释下面的行,并且每次都让它查找该人,它就会起作用。

这是Yii的问题吗?我真的希望能够缓存person对象,这样我就可以在整个会话中引用它,而无需对数据库进行更多调用。我错过了什么?

2 个答案:

答案 0 :(得分:3)

Yii没有问题.... 根据文档,CWebUser类标识预定义变量“id”和“name”,它们在整个会话期间保持不变。任何其他变量都应与getState()和setState()方法一起使用。 “此外,CWebUser应与IUserIdentity Class一起使用,它实现了实际的身份验证算法。”

答案 1 :(得分:2)

永远不会调用方法loadUser()。内部的login()调用也没有意义。 getPerson()的更简单实现将是。

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