1

我已阅读有关如何制作 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 对象,这样我就可以在整个会话期间引用它,而不必对数据库进行更多调用。我错过了什么??

4

2 回答 2

3

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

于 2013-03-06T06:55:17.023 回答
2

该方法loadUser()永远不会被调用。而且login()里面的调用也没有意义。一个更简单的实现getPerson()将是。

private $_person = false;
public function getPerson()
{
    if($this->_person===false)
        $this->_person = Person::model()->findByPk($this->id);
    return $this->_person;
}
于 2013-03-06T15:47:29.163 回答