Yii :: app-> user-> id;返回用户名而不是ID号

问题描述

| 我有一个非常奇怪的问题,在一台计算机上,“ 0”会返回用户名,但是在另一台运行相同代码的计算机上,我正在按预期获取ID号。
Yii::app()->user->id
如何获取用户名?我错过了什么?     

解决方法

        首先,让我们来看看用户登录后发生了什么。 后
    $identity->authenticate();
如果
    $identity->errorCode===UserIdentity::ERROR_NONE
然后我们将执行登录操作
    Yii::app()->user->login($identity,$duration)
登录背后是什么? 我已经扫描了yii的来源 主要思想是
    $this->changeIdentity($id,$identity->getName(),$states);
在CWebUser类的登录功能中。 下面是changeIdentity函数
    protected function changeIdentity($id,$name,$states)
{ 
    Yii::app()->getSession()->regenerateID(true);
    $this->setId($id);
    $this->setName($name);
    $this->loadIdentityStates($states);
}
其次: 让我们回顾一下问题
    Yii::app()->user->id;
这意味着要运行扩展CWebUser的类的getId()方法,并在sites(应用程序的根目录)/protected/config/main.php中对其进行配置,如下所示:
    \'components\'=>array(
    \'user\'=>array(
        \'class\'=>\'WebUser\',// enable cookie-based authentication
        \'allowAutoLogin\'=>true,),
以我为例,该类扩展的CWebUser是WebUser。 在WebUser中,没有getId()方法,该方法将从CWebUser继承,因为WebUser是从CWebUser扩展的。所以这是CWebUser的getId()方法。 https://github.com/yiisoft/yii/blob/1.1.13/framework/web/auth/CWebUser.php#LC287
     public function getId()
{
    return $this->getState(\'__id\');
}
那么什么时候设置“ __id”? 显然,它是在changeIdentity函数的语句中设置的:
    $this->setId($id);
争论$ id值从哪里来? 我们在类CWebUser的以下代码中知道这一点:
    public function login($identity,$duration=0)
{ 
    $id=$identity->getId();


    $states=$identity->getPersistentStates();



    if($this->beforeLogin($id,$states,false))
    {
        $this->changeIdentity($id,$states);

        if($duration>0)
        {
            if($this->allowAutoLogin)
                $this->saveToCookie($duration);
            else
                throw new CException(Yii::t(\'yii\',\'{class}.allowAutoLogin must be set true in order to use cookie-based authentication.\',array(\'{class}\'=>get_class($this))));
        }

        $this->afterLogin(false);
    }
    return !$this->getIsGuest();
}
    $id = $identity->getId();
因此我们只能在$ idenity中添加getId函数,这意味着我们在以下位置添加了getId函数 扩展CUserIdentity的UserIdentity,如下所示:
public function getId()
{
    return $this->_id;
}
public function setId($id)
{
    $this->_id = $id;
    return;
}
当用户成功登录后,我们可以在扩展CUserIdentity的UserIdentity的authenticate函数中将user_id传递给setId($ id),如下所示:     公共功能authenticate()     {
    $record=User::model()->findByAttributes(array(\'user_name\'=>$this->username));

    if($record===null)
        $this->errorCode=self::ERROR_USERNAME_INVALID;
    else if($record->password!==md5($this->password))
        $this->errorCode=self::ERROR_PASSWORD_INVALID;
    else
    {
        $this->setId($record->user_id);


        $this->errorCode=self::ERROR_NONE;
    }
    return !$this->errorCode;
}
    ,        您必须在
UserIdentity
类中重写方法
getId()
。 在您的标识类中,只需添加以下内容:
private $_id;

public function getId()
{
    return $this->_id;
}
然后最后您可以使用
$this->_id = $user->id
关于它的更多信息,请参考以下链接: http://www.yiiframework.com/doc/guide/1.1/en/topics.auth#defining-identity-class     ,        试试这个,设置用户名:
$this->_id=$user->id;
$this->username=$user->username;
    ,        您有两种方法可以解决此问题:
1) Yii::app()->user->setState(\"id\",$user->id);
2) Yii::app()->user->id = $user->id;
两种方法都使用$ _SESSION来保存值。 那么您可以像这样检索值:
Yii::app()->user->id;
    ,        试试这个
Yii::app()->user->getId()
    ,        即使我遇到了同样的问题,一切都还好,但是我获得了用户名。 您检查您的Useridentity文件。 在其他部分,您可能会错过指针(->)之类的东西。
    {
        $this->_id = $user->id; /*here u might miss pointer -> */
        // print_r($this->_id);exit;
        $this->errorCode = self::ERROR_NONE;
    }
希望它能对您有所帮助。     ,        yii默认安装将用户ID设置为用户名(默认为admin或demo)。 如果更改用户脚本并使用sql并对其进行建议的修改,则id作为表中的id字段返回。