web-dev-qa-db-fra.com

Comment ajouter plus d'attributs de session d'identité d'utilisateur dans Yii2?

Dans Yii2, vous pouvez accéder à l'interface d'identité de l'utilisateur actuel en utilisant l'objet identityInterface depuis la classe\yii\web\User avec quelque chose comme ceci

 \Yii::$app->user->identity->id;

Existe-t-il un moyen d'obtenir et de définir des paramètres supplémentaires (sans étendre la classe d'identité)?

Fondamentalement, un équivalent des méthodes Yii 1.x getState() et setState() dans CWebUser pour stocker et récupérer des informations de session comme celle-ci

Yii::app()->user->setState("some_attribute",$value);
Yii::app()->user->getState('some_attribute',$defaultValue);
18
Manquer

D'accord, cela semble avoir été supprimé intentionnellement pour éviter toute "confusion". Voir https://github.com/yiisoft/yii2/issues/167 . Donc, la seule façon de le faire en appelant directement la classe de session.

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

Parce qu'il est maintenant stocké directement dans la session sans préfixe, il est préférable d'espacer les clés avec des identifiants comme user.xxxx pour éviter la collision avec une autre clé définie à différents points de l'application.

24
Manquer

La meilleure façon d'ajouter des attributs à l'utilisateur consiste à créer un attribut public dans votre classe d'utilisateurs.

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

Comment utiliser:

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

Dans Yii2 \ Yii :: $ app-> user-> identity contient une instance de la classe d'identité. Donc, si vous voulez des données liées à identityClass - utilisez-les simplement comme une instance de identityClass.

7
usualdesigner

Vous pouvez également utiliser une fonction getter pour inclure des informations d'identité supplémentaires pour l'utilisateur. Par exemple, récupérez fullname dans une table de profils.

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;
    }
}

Ensuite, vous pouvez l'utiliser comme si vous aviez un attribut nommé fullname, comme ceci

Yii::$app->user->identity->fullname;
1
Osh Mansor