2018-05-19 01:11:00 1987次浏览 2条回答 0 悬赏 50 金钱

自定的 Yii::$app->user->identity->get***() 方法在编辑器里找不到定义,这些方法是挂载在 登陆的 User model里了。

最佳答案

  • 灰太狼 发布于 2018-05-19 11:59 举报

    或者你可以使用user 的关联模型自定义方法。例如User模型里定义了hasOne关联Store表。那么可以在Store模型里自定义方法,然后调用方式这样:

    Yii::$app->user->identity->store->自定义方法()
    

    Yii::$app是应用的实例,调用组件的。例如 Yii::$app->user 是当前应用调用user组件
    user 是模型
    identity 是定义的接口也就是user模型必须要实现的接口,因为在调用login时注入进入的必须是 IdentityInterface,
    最后返回的是关联的user对象(但是这个关联对象必须要实现接口)
    store 是user的关联对象返回的是store对象
    自定义方法()是store里面的一个函数,那可以可以store->自定义方法()调用了

    讲解一下identity ,identity是身份的意思。是在登录的时候存储用户身份信息。那它是怎么存储的呢?
    Yii::$app->user的关联对象identity
    Yii::$app这个都知道了吧,就是Yii应用实例 Yii::$app->user 是当前应用调用user组件(前面已经说了)
    那它怎么怎么知道去调用user组件?因为在main.conf配置的:

     'user' => [
                'identityClass' => '\Common\Models\User',
                'enableAutoLogin' => true,
                'enableSession' => false,
                'loginUrl' => null,
            ],
    

    仔细看发现了identity 这个词。但是他的全称是identityClass 这里定义的是身份验证信息调用使用的类是\Common\Models\User,也就是你的User模型,但是这个User模型时有要求的,必须实现implements IdentityInterface接口。然后程序运行后,会自动注册user组件(注册的是vendor/yiisoft/yii2/web/User.php)而不是你config配置的user,Config配置的user只是用来获取关联对象,然后可以这样使用了Yii::$app->user->identity ,但是执行identity的时候实际没有这个方法,应该会报错的,Yii使用了PHP的机制会去尝试执行getIdentity()。
    上面说了,user是 vendor/yiisoft/yii2/web/User.php的组件,那么user->identity肯定是在vendor/yiisoft/yii2/web/User.php下面找是不是有getIdentity()。如果没找到,我直播吃翔。。。

    然后在看 $this->renewAuthStatus();这个就是给identity复制user对象数据。
    注意这两行:

    $class = $this->identityClass;   //这个就是config里定义identityClass对应的的类(自己定义的user模型类)
    $identity = $class::findIdentity($id); //这个就是调用模型类里的方法findIdentity获取用户信息
    

    这个findIdentity方法其实是接口 IdentityInterface 的具体实现。 (你可以试试点击鼠标进入这个findIdentity方法)他会跳到IdentityInterface接口里。所以说Yii::$app->user->identity->你写的方法()执行不了。因为你要在接口里定义.

  • 回答于 2018-05-19 11:20 举报

    因为 Yii::$app->user->identity 是实现 IdentityInterface 接口的。是使用IdentityInterface接口的契约规定,

    public function login(IdentityInterface $identity, $duration = 0){}
    传入的identity这个就是user查询结果对象,但是这个对象要符合依赖注入的规定。

    而你的User model 里自定义了一个放,但是这个方法只是你model里的。登录后不会注册到这个方法,因为这个方法不符合login(IdentityInterface $identit)这个规定,它接收的是一个接口,你的Model要实现这个接口,也就是说,你要在接口里定义好方法,然后在user模型里写方法的具体实现。这样才能使用 Yii::$app->user->identity->get***()

    1 条回复
    回复于 2018-05-19 11:54 回复

    那就算了。尽量不改源码,现在不能定位 还是能用的。

您需要登录后才可以回答。登录 | 立即注册
小叮当的肚兜
副董事长

小叮当的肚兜

注册时间:2016-10-31
最后登录:11小时前
在线时长:97小时45分
  • 粉丝13
  • 金钱44030
  • 威望270
  • 积分47700

热门问题