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

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

  •  02-01-2020
  •  | 
  •  

Question

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 de Yii 1.x getState(), et setState() méthodes 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);
Était-ce utile?

La solution

D'accord, il semble que cela ait é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 désormais stocké directement en session sans préfixe, il est préférable de nommer les clés avec des identifiants tels que user.xxxx pour éviter toute collision avec un autre jeu de clés à différents points de l'application.

Autres conseils

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;

Dans Yii2 \Yii::$app->utilisateur->identité contient une instance de l'identityClass.Donc, si vous souhaitez des données liées à l'identityClass, utilisez-les simplement comme une instance de l'identityClass.

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

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, ainsi

Yii::$app->user->identity->fullname;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top