У меня очень странная проблема в том, что на одном компьютере 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 в таблице.