在Yii2中添加新的用户标识值

在Yii2中添加新的用户标识值,yii2,yii2-advanced-app,Yii2,Yii2 Advanced App,我需要为用户标识分配一个新变量,如 Yii::$app->user->identity->staff_name = 'myName'; 我添加了public$staff\u name在identityClass中,通常是common\models\User,但在我的例子中是common\models\Person 但是当我打印Yii::$app->user->identity时 Yii::$app->user->identity->staff_name v

我需要为用户标识分配一个新变量,如

 Yii::$app->user->identity->staff_name = 'myName';
我添加了
public$staff\u name在identityClass中,通常是
common\models\User
,但在我的例子中是
common\models\Person

但是当我打印
Yii::$app->user->identity

Yii::$app->user->identity->staff_name value is blank.
为什么为空?

遵循的步骤
  • 您应该将公共属性
    staff\u name
    添加到
    safe
    规则中
见下文

public function rules(){
       return[
            [['staff_name'],'safe']
       ] ;
}
  • 如果您使用的是dektrium/yii2用户,请使用以下方法添加到父规则
添加到您的
个人
模型

public function rules() {
        return array_merge (parent::rules (), [ 'staff_nameSafe' => ['staff_name' , 'safe' ] ] );
    }
  • 然后您也需要手动加载此属性。它不会像其他模型属性那样自动具有值,而这些模型属性是实际的表字段,因此请在
    Person
    模型中使用
    afterFind
    ,如下所示
注意:我使用硬编码字符串
示例员工姓名
作为
员工姓名
根据您的需要进行调整

public function afterFind() {
    parent::afterFind ();
    $this->staff_name="SAMPLE STAFF NAME";
}
测试
现在你可以使用
print\r(Yii::$app->user->identity->staff\u name)并将打印名称

SAMPLE STAFF NAME

您是否更改了组件配置中的identityClass?是的,它类似于'user'=>['identityClass'=>'common\models\Person','enableAutoLogin'=>true','identityCookie'=>['name'=>'\U identity-backend','httpOnly'=>true],],1。确保Yii::$app->user->identity属于正确的类common\models\Person。2.确保common\models\Person的实例允许在外部(而不是从类自己的方法)设置“staff\u name”属性3。最后,确保在检查/打印员工姓名之前设置员工姓名。以防万一。您是否在登录后设置(并检查)它?您可以尝试
Yii::$app->user->identity->canSetProperty('staff_name')
(尽管您似乎已经知道答案)。它是否适用于其他属性,如
id
或您在身份验证期间使用的任何属性?如果它帮助您解决了问题,请将答案标记为正确,以便其他有相同问题的人也可以获得帮助我需要添加哪些类?您使用的类作为身份,即
common\models\Person
,我认为,你已在问题中详细说明@user7282是否会自动调用afterFind()?
afterFind()
在创建AR对象并填充查询结果时调用。默认实现将在FIND
事件之后触发
事件。重写此方法时,请确保调用父实现以确保触发事件@user7282在上面给出的方法中,其
parent::afterFind()