Как добавить дополнительные атрибуты сеанса идентификации пользователя в Yii2?

StackOverflow https://stackoverflow.com//questions/25079781

  •  02-01-2020
  •  | 
  •  

Вопрос

В 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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top