CWebUser中的setState和CUserIdenitity在示例中搞砸了

时间:2013-01-08 17:17:40

标签: php yii

我看到了几个(几乎相当的)关于如何在Yii中扩展Yii::app()->user信息的例子。这是one of them

代码(原样):

class UserIdentity extends CUserIdentity
{
    private $_id;

    public function authenticate()
    {
        $user=User::model()->findByAttributes(array('username'=>$this->username));
        if($user===null)
            $this->errorCode=self::ERROR_USERNAME_INVALID;
        else if($user->password!==md5($this->password))
            $this->errorCode=self::ERROR_PASSWORD_INVALID;
        else
        {
            $this->_id=$user->id;
            $this->setState('lastLoginTime', $user->lastLoginTime); // added property
            $this->errorCode=self::ERROR_NONE;
        }
        return !$this->errorCode;
    }

    public function getId()
    {
        return $this->_id;
    }
}

确认之后我们可以按如下方式访问lastLoginTime值:

Yii::app()->user->lastLoginTime

这里的问题是我们为setState调用$this CUserIdentity ,而Yii::app()->user CWebUser CWebUser 默认情况下没有任何对 CUserIdentity 的引用。

它们都确实支持通过setState存储其他属性并通过getState检索它们,但首先使用内部_state数组,第二个写入{{1} }}

所以问题是 - 我们如何将扩展信息写入一个实体,然后从另一个实体读取?我没有在Yii代码中看到任何可以提供此功能的内容。在示例中看起来像是一个错误。

1 个答案:

答案 0 :(得分:1)

当您调用Yii::app()->user->login()的登录方法时,您必须传递一个useridentity对象,这意味着CWebuser确实引用了useridentity

Yii::app()->user->login($userIdentity,$duration);