Как добавить дополнительные атрибуты сеанса идентификации пользователя в Yii2?
В Yii2 вы можете получить доступ к интерфейсу идентификации для текущего пользователя, используя объект identityInterface из класса \yii\web\User с чем-то вроде этого
\Yii::$app->user->identity->id;
Есть ли способ получить и установить дополнительные параметры (без расширения класса идентификации)?
В основном эквивалент методов Yii 1.x getState()
и setState()
в CWebUser
для хранения и получения информации о сеансе, подобной этой
Yii::app()->user->setState("some_attribute",$value);
Yii::app()->user->getState('some_attribute',$defaultValue);
Ответы
Ответ 1
Хорошо, кажется, это было умышленно устранено, чтобы избежать "путаницы". См. https://github.com/yiisoft/yii2/issues/167. Таким образом, единственный способ сделать это, вызвав класс сеанса напрямую.
\Yii::$app->session->set('user.attribute',$value);
\Yii::$app->session->get('user.some_attribute');
Поскольку он теперь хранится непосредственно в сеансе без префикса, лучше просто пропустить пространства имен с идентификаторами типа user.xxxx
, чтобы избежать столкновения с каким-либо другим ключом, установленным в разных точках приложения.
Ответ 2
Лучшим способом добавления атрибутов для пользователя является создание публичного атрибута в пользовательском классе.
class Yiidentity extends ActiveRecord implements \yii\web\IdentityInterface{
public $awesomeAttribute = "foo";
}
Как использовать:
Yii::$app->user->identity->awesomeAttribute;
Ответ 3
В Yii2 \Yii:: $app- > user- > identity содержится экземпляр identityClass. Итак, если вам нужны некоторые данные, связанные с идентификатором, - просто используйте его как экземпляр identityClass.
Ответ 4
Вы также можете использовать функцию getter, чтобы добавить дополнительную идентификационную информацию для пользователя. Например, извлеките 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;