我想在大多数视图文件中都有一个变量$ 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变量。
答案 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');