在所有Yii视图中都有一个变量

时间:2013-07-12 08:54:13

标签: php inheritance yii scope

我想在大多数视图文件中都有一个变量$ user_profile,而不必在每个控制器文件中创建变量。目前我的工作正常,但我想知道是否有更好的解决方案

我有一些代码来填充变量

$user_profile = YumUser::model()->findByPk(Yii::app()->user->id)->profile;

然后是父类

class Controller extends CController { 

    public function getUserProfile()
    {
      $user_profile = YumUser::model()->findByPk(Yii::app()->user->id)->profile;
    }

}

然后我让所有其他控制器继承Controller类,例如

class DashboardController extends Controller
{

public function actionIndex()
{
    $user_profile = parent::getUserProfile();
    $this->render('index', array('user_profile' => $user_profile));

}

}

然后最终在视图文件中我可以简单地访问$ user_profile变量。

3 个答案:

答案 0 :(得分:8)

在基本控制器类中创建类字段:

class Controller extends CController { 
    public $user_profile;

    public function init()
    {
      parent::init();
      $this->user_profile = YumUser::model()->findByPk(Yii::app()->user->id)->profile;
    }
}

不需要直接传递给视图:

public function actionIndex()
{
    $this->render('index');
}

然后,您可以使用$this

在视图中访问它
// index.php
var_dump($this->user_profile);

答案 1 :(得分:2)

您已经定义了一个getter,因此您可以使用来自控制器和视图的$this->userProfile。我只添加了一个缓存逻辑,以避免对数据库进行多次查询:

class Controller extends CController
{

    protected $_userProfile=false;

    /*
     * @return mixed a User object or null if user not found or guest user
     */
    public function getUserProfile()
    {
        if($this->_userProfile===false) {
            $user = YumUser::model()->findByPk(Yii::app()->user->id);
            $this->_userProfile = $user===null ? null : $user->profile;
        }
        return $this->_userProfile;
    }

答案 2 :(得分:0)

对于用户个人资料信息,我在登录时使用setState填充少量变量来存储数据。

在成功进行身份验证后的UserIdentity类中,您可以存储与此类似的数据:

$userRecord = User::model()->find("user_name='".$this->username."'");  
$this->setState('display_name', 
    (isset($userRecord->first_name)) ? 
        $userRecord->first_name : $userRecord->user_name); 

然后在任何视图中,都可以访问它:

echo (isset(Yii::app()->user->display_name) ? 
        Yii::app()->user->display_name : 'Guest');