对于我必须加载的每个请求,或者至少创建一个 MyUser 的实例,其中包含用户名,一些内部权限信息,链接到头像等等。
问题是我需要为每个控制器提供此信息,对于大多数视图(根据用户状态和权限呈现或不呈现某些控件)。
听起来需要一个全局变量,在处理请求时创建。解决这个问题的最佳方法是什么?
答案 0 :(得分:2)
使用您的自定义类WebUser覆盖CWebUser(您在发布Yii :: app() - > user时调用的内容)(放置在组件或其他包含自动类的文件夹中),并定义一些getters,如它是通过下面的getRole()示例完成的:
<?php
class WebUser extends CWebUser {
private $_model = null;
function getRole() {
if($user = $this->getModel()){
return $user->userRole->name;
}
}
private function getModel(){
if (!$this->isGuest && $this->_model === null){
$this->_model = User::model()->findByPk($this->id);
}
return $this->_model;
}
}
如果您使用自定义类而不是CWebUser,则必须明确告知在应用程序的配置中使用哪个类:
'user'=>array(
'class' => 'WebUser',
// …
),
答案 1 :(得分:2)
您可以在基本控制器的构造函数中创建(或注入)MyUser
的实例,并将其设置为公共属性:
//i am not familiar with Yii naming conventions, so ignore class name etc
class BaseController
{
public $user;
//presuming you can inject, if not $user = new MyUser();
function __construct(MyUser $user){
$this->user = $user;
}
}
然后,所有继承BaseController的控制器都可以访问:
class HomeController extends BaseController
{
function someAction(){
$name = $this->user->name;
}
}
无论一个动作是否访问该实例,它在所有视图中都可用,而不作为参数传递给渲染:
//someview
echo $this->user->name;