coquille 2011-08-17 08:53:36 3901次浏览 5条回复 0 0 0

我在rbac里面定义了一条业务规则:

return (Yii::app()->user->profile->userlevel >= $params[0]->VERSION_LEVEL);[/code]User Model里面的relations定义是这样的:
/**
* @return array relational rules.
*/
public function relations()
{
  $relations = array(
    'profile'=>array(self::HAS_ONE, 'Profile', 'user_id'),
  );
  if (isset(Yii::app()->getModule('user')->relations)) $relations = array_merge($relations,Yii::app()->getModule('user')->relations);
    return $relations;
}

在CAuthManager基类里面,业务规则是用eval动态执行的:

public function executeBizRule($bizRule,$params,$data)
{
  return $bizRule==='' || $bizRule===null || ($this->showErrors ? eval($bizRule)!=0 : @eval($bizRule)!=0);
}

奇怪的是,在其他地方调用Yii::app()->user->profile没问题,但是在这个场合就报告 【属性 "CWebUser.profile" 未被定义. 】的错误。是不是我哪儿弄错了? 按理说,在调用Yii::app()->user->profile时,应该有一个关联查询会被执行, 执行结果合并到Yii::app()->user->profile属性啊。。。

  • 回复于 2011-08-17 09:07 举报

    Yii::app()->user是CWebUser实例,当然没有profile属性了。
    你的profile是在模型类中定义的。如果想取得当前用户的profile,应该是User::model()->findByPk(Yii::app()->user->id)->profile->userlevel

  • 回复于 2011-08-17 09:29 举报

    嗯,多谢老大。:)
    User Model的一些属性是怎样合并到Yii::app()->user中去的我还没搞明白。

  • 回复于 2011-08-17 09:45 举报

    通过setState可以合并到Yii::app()->user中,自己看一下文档就明白了
    比如我要把用户等级写到Yii::app()->user中,那就在UserIdentity类中通过验证以后设置$this->setState('level', $record->level);

    登录以后,可以使用Yii::app()->user->getState('level')来获取等级。

  • 回复于 2011-08-17 09:46 举报

    Yii Framework验证身份并储存用户状态
    Yii Framework验证身份并储存用户状态

  • 回复于 2011-08-17 09:54 举报

    感恩老大。
    原理大致明白了,回头详细学习。

您需要登录后才可以回复。登录 | 立即注册