сначала, давайте посмотрим, что произошло после входа пользователя в систему.
после
$identity->authenticate();
если
$identity->errorCode===UserIdentity::ERROR_NONE
, тогда мы перейдем к логинуaction
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?очевидно, это установлено в операторе 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,$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,как это: публичная функция 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;
}