Yii 1.1:跨控制器变量(甚至是交叉控制变量)

时间:2014-10-28 13:13:40

标签: php yii

对于我必须加载的每个请求,或者至少创建一个 MyUser 的实例,其中包含用户名,一些内部权限信息,链接到头像等等。

问题是我需要为每个控制器提供此信息,对于大多数视图(根据用户状态和权限呈现或不呈现某些控件)。

听起来需要一个全局变量,在处理请求时创建。解决这个问题的最佳方法是什么?

2 个答案:

答案 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;