Как добавить дополнительные атрибуты сеанса идентификации пользователя в Yii2?
Вопрос
В Yii2 вы можете получить доступ к интерфейсу идентификации для текущего пользователя, используя объект identityInterface из класса \yii\web\User примерно так
\Yii::$app->user->identity->id;
Есть ли способ получить и установить дополнительные параметры (без расширения класса identity)?
По сути, это эквивалент Yii 1.x getState()
, и setState()
методы в CWebUser
для хранения и извлечения информации о сеансе, подобной этой
Yii::app()->user->setState("some_attribute",$value);
Yii::app()->user->getState('some_attribute',$defaultValue);
Решение
Ладно, похоже, это было удалено намеренно, чтобы избежать "путаницы".Видеть https://github.com/yiisoft/yii2/issues/167.Таким образом, единственный способ сделать это - вызвать класс session напрямую.
\Yii::$app->session->set('user.attribute',$value);
\Yii::$app->session->get('user.some_attribute');
Поскольку теперь он хранится непосредственно в сеансе без префикса, лучше всего поместить ключи в пространство имен с такими идентификаторами, как user.xxxx
чтобы избежать столкновения с каким-либо другим ключом, установленным в другой точке приложения.
Другие советы
Лучший способ добавить атрибуты к user - это создать общедоступный атрибут в вашем классе User.
class Yiidentity extends ActiveRecord implements \yii\web\IdentityInterface{
public $awesomeAttribute = "foo";
}
Как использовать:
Yii::$app->user->identity->awesomeAttribute;
В Yii2 \Yii::$приложение->пользователь->идентификация содержит экземпляр класса identityClass.Итак, если вам нужны какие-то данные, связанные с identityClass - просто используйте их как экземпляр identityClass.
Вы также могли бы использовать добытчик функция для включения дополнительной идентификационной информации для пользователя.Например, извлеките fullname
из таблицы профилей.
class User extends ActiveRecord implements \yii\web\IdentityInterface
{
// Other code goes here...
public function getFullname()
{
$profile = Profile::find()->where(['user_id'=>$this->id])->one();
if ($profile !==null)
return $profile->fullname;
return false;
}
}
Затем вы можете использовать его так, как если бы у вас был атрибут с именем fullname
, вот так
Yii::$app->user->identity->fullname;