Pregunta

En Yii2 puedes acceder a la interfaz de identidad para el usuario actual usando el objeto IdentityInterface desde dentro de la clase \yii\web\User con algo como esto

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

¿Hay alguna manera de obtener y establecer parámetros adicionales (sin extender la clase de identidad)?

Básicamente un equivalente de Yii 1.x getState(), y setState() métodos en CWebUser para almacenar y recuperar información de sesión como esta

Yii::app()->user->setState("some_attribute",$value);
Yii::app()->user->getState('some_attribute',$defaultValue);
¿Fue útil?

Solución

Bien, parece que esto se eliminó intencionalmente para evitar "confusión".Ver https://github.com/yiisoft/yii2/issues/167.Entonces, la única forma de hacer esto es llamar directamente a la clase de sesión.

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

Debido a que ahora se almacena directamente en la sesión sin prefijo, es mejor asignar un espacio de nombres a las claves con identificadores como user.xxxx para evitar colisiones con alguna otra clave configurada en un punto diferente de la aplicación.

Otros consejos

La mejor manera de agregar atributos al usuario es crear atributos públicos en su clase de usuario.

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

Cómo utilizar:

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

En Yii2 \Yii::$aplicación->usuario->identidad contiene una instancia de la clase de identidad.Entonces, si desea algunos datos relacionados con la clase de identidad, simplemente utilícelos como una instancia de la clase de identidad.

También podrías usar un adquiridor función para incluir información de identidad adicional para el usuario.Por ejemplo, recuperar fullname de una tabla de perfil.

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

Luego, puedes usarlo como si tuvieras un atributo llamado fullname, al igual que

Yii::$app->user->identity->fullname;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top