Как добавить дополнительные атрибуты сеанса идентификации пользователя в 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); 

Ладно, кажется, это было умышленно устранено, чтобы избежать «путаницы». См. https://github.com/yiisoft/yii2/issues/167 . Таким образом, единственный способ сделать это, вызвав класс сеанса напрямую.

 \Yii::$app->session->set('user.attribute',$value); \Yii::$app->session->get('user.some_attribute'); 

Поскольку он теперь хранится непосредственно в сеансе без префикса, лучше просто user.xxxx ключи с идентификаторами, такими как user.xxxx чтобы избежать столкновения с каким-либо другим ключом, установленным в другой точке приложения.

Лучший способ добавить атрибуты для пользователя – создать публичный атрибут в вашем классе пользователя.

 class Yiidentity extends ActiveRecord implements \yii\web\IdentityInterface{ public $awesomeAttribute = "foo"; } 

Как использовать:

 Yii::$app->user->identity->awesomeAttribute; 

В Yii2 \ Yii :: $ app-> user-> identity содержится экземпляр identityClass. Итак, если вы хотите некоторые данные, связанные с идентификатором, – просто используйте его как экземпляр идентификатора.

Вы также можете использовать функцию 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;