我已阅读有关如何创建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对象,这样我就可以在整个会话中引用它,而无需对数据库进行更多调用。我错过了什么?
答案 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;
}