Yii :: приложение () -> user-> идентификатор; возвращает имя пользователя вместо идентификатора

У меня очень странная проблема в том, что на одном компьютере Yii::app()->user->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; 

Это означает, что вы запускаете метод getId () вашего класса, который расширяет CWebUser, и вы настраиваете его на сайтах (корень вашего приложения) /protected/config/main.php следующим образом:

  'components'=>array( 'user'=>array( 'class'=>'WebUser', // enable cookie-based authentication 'allowAutoLogin'=>true, ), 

В моем случае класс расширяет CWebUser – это WebUser.

В WebUser отсутствует метод getId (), метод будет наследоваться от CWebUser, поскольку WebUser распространяется из CWebUser. так что это метод getId () из CWebUser.

https://github.com/yiisoft/yii/blob/1.1.13/framework/web/auth/CWebUser.php#LC287

  public function getId() { return $this->getState('__id'); } 

поэтому, когда установлен «__id»? очевидно, он задается в инструкции функции изменения:

  $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,$identity->getName(),$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(); } использования  public function login($identity,$duration=0) { $id=$identity->getId(); $states=$identity->getPersistentStates(); if($this->beforeLogin($id,$states,false)) { $this->changeIdentity($id,$identity->getName(),$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(); } данных  public function login($identity,$duration=0) { $id=$identity->getId(); $states=$identity->getPersistentStates(); if($this->beforeLogin($id,$states,false)) { $this->changeIdentity($id,$identity->getName(),$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(); } использования  public function login($identity,$duration=0) { $id=$identity->getId(); $states=$identity->getPersistentStates(); if($this->beforeLogin($id,$states,false)) { $this->changeIdentity($id,$identity->getName(),$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(); } данных  public function login($identity,$duration=0) { $id=$identity->getId(); $states=$identity->getPersistentStates(); if($this->beforeLogin($id,$states,false)) { $this->changeIdentity($id,$identity->getName(),$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(); } использования  public function login($identity,$duration=0) { $id=$identity->getId(); $states=$identity->getPersistentStates(); if($this->beforeLogin($id,$states,false)) { $this->changeIdentity($id,$identity->getName(),$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(); } данных  public function login($identity,$duration=0) { $id=$identity->getId(); $states=$identity->getPersistentStates(); if($this->beforeLogin($id,$states,false)) { $this->changeIdentity($id,$identity->getName(),$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(); 

поэтому мы можем добавить функцию getId в $ idenity, это означает, что мы добавляем функцию getId в UserIdentity, которые расширяют CUserIdentity, например:

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

а также

 public function setId($id) { $this->_id = $id; return; } 

при успешном входе пользователя, мы можем передать user_id в setId ($ id) в функции аутентификации UserIdentity, которая расширяет CUserIdentity, например: public function 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; } 

Вы должны переопределить метод getId() в вашем классе UserIdentity .

В своем классе идентификации просто добавьте следующее:

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

и, наконец, вы можете установить 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 по умолчанию устанавливает идентификатор пользователя как имя пользователя (по умолчанию – admin или demo). Если вы измените сценарий пользователя и используете sql и сделаете рекомендуемые изменения для этого, id будет возвращен как поле id в таблице.