Como adicionar mais identidade do usuário da sessão de atributos em Yii2?
Pergunta
Em Yii2 você pode acessar a identidade de interface para o usuário atual usando o identityInterface objeto de dentro da \o yii\web\Usuário de classe com algo como isto
\Yii::$app->user->identity->id;
Existe uma maneira de obter e definir parâmetros adicionais (sem estender a identidade de classe)?
Basicamente, um equivalente do Yii 1.x getState()
, e setState()
métodos CWebUser
para armazenar e recuperar informações de sessão como esta
Yii::app()->user->setState("some_attribute",$value);
Yii::app()->user->getState('some_attribute',$defaultValue);
Solução
Bem parece que este foi removido intencionalmente para evitar "confusão".Ver https://github.com/yiisoft/yii2/issues/167.Assim, a única maneira de fazer isso chamando a classe de sessão diretamente.
\Yii::$app->session->set('user.attribute',$value);
\Yii::$app->session->get('user.some_attribute');
Porque agora armazenados diretamente na sessão sem prefixo é melhor namespace as teclas com identificadores como user.xxxx
para evitar a colisão com outro conjunto de chaves em outro ponto da aplicação.
Outras dicas
A melhor maneira para adicionar atributos para o usuário está criando pública atributo em sua Classe de Usuário.
class Yiidentity extends ActiveRecord implements \yii\web\IdentityInterface{
public $awesomeAttribute = "foo";
}
Como usar:
Yii::$app->user->identity->awesomeAttribute;
Em Yii2 \O Yii::$app->user->identidade conter instância do identityClass.Então, se você quiser alguma identityClass-dados relacionados - apenas usá-lo como instância de identityClass.
Você também pode usar um getter função para incluir outras informações de identidade do usuário.Por exemplo, recuperar fullname
a partir de uma tabela 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;
}
}
Em seguida, você pode usá-lo como se você possui um atributo chamado fullname
, assim como
Yii::$app->user->identity->fullname;