通过覆盖它在CWebUser中向changeIdentity发送更多数据?

时间:2012-12-01 13:33:45

标签: yii

免责声明:在Yii中完成初学者,有一些PHP经验 在Yii中,是否可以覆盖CWebUser的login方法?
我想这样做的原因是因为源代码中的注释声明changeIdentity方法可以被子类重写,但是因为我想向这个方法发送更多参数,我想要覆盖{{1也是(CWebUser的)方法。
另外,如果这不是一个好主意,你如何将额外的参数发送到login方法。(通过某种方式从changeIdentity参数中检索它?)。额外参数是UserIdentity类的新定义属性。

1 个答案:

答案 0 :(得分:1)

最好首先尝试通过覆盖components/UserIdentity.php的身份验证方法来执行您希望执行的操作。事实上,这对于实现任何比它启动的默认演示和管理登录更先进的安全系统是必要的。

在该方法中,您可以使用

$this->setState('myVar', 5);

然后访问网络应用中的任何位置,如下所示:

Yii::app()->user->getState('myVar');

如果未定义myVar,则默认情况下该方法将返回null。否则它将返回它存储的任何内容,在我的示例中,5。这些值存储在$ _SESSION变量中,因此只要会话执行,它们就会一直存在。

更新:好的,花时间了解Yii的整个混乱是如何工作的另一个答案,所以我也在这里分享我的发现。以下内容主要是从我刚才在其他地方给出的类似答案中复制粘贴的。这在我的系统上经过测试,可以在页面之间进行工作和持久化。

您需要扩展CWebUser类以获得所需的结果。

class WebUser extends CWebUser{
    protected $_myVar = 'myvar_default';

    public function getMyVar(){
        $myVar = Yii::app()->user->getState('myVar');
        return (null!==$myVar)?$myVar:$this->_myVar;
    }

    public function setMyVar($value){
        Yii::app()->user->setState('myVar', $value);
    }
}

然后,您可以使用myVar分配和调用Yii::app()->user->myVar属性。

将上述课程放在components/WebUser.php中,或将其加载或自动加载的任何地方。

更改您的配置文件以使用新的WebUser类,您应该全部设置。

'components'=>
    'user'=>array(
        'class'=>'WebUser',
    ),
...
),