Подтвердить что ты не робот

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

Ответ 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;