在 CakePHP 2.x 中使变量可用于所有控制器
Posted
技术标签:
【中文标题】在 CakePHP 2.x 中使变量可用于所有控制器【英文标题】:Making variables available to all controllers in CakePHP 2.x 【发布时间】:2013-06-04 08:43:58 【问题描述】:我正在使用 Cakephp 2.x 和 CakeDC 用户插件。我正在尝试通过将以下代码放在我的 AppController 的beforefilter()
中来使所有控制器都可以使用变量 *'editprofile' 和 'profile_area_pic' - 此代码允许我显示用户个人资料图片并且工作正常,直到您尝试注册用户并给出以下错误:
[PDOException] SQLSTATE[42000]: Syntax error or access violation: 1064
你的SQL语法有错误;查看与您的 mysql 服务器版本相对应的手册,了解在第 1 行的“注册”附近使用的正确语法。
有没有人更好地了解如何使这些变量可用?提前致谢。
//////////// * 使以下变量可用///////////////////////// /////////////
$this->loadModel('Profile');
$profileedit = $this->Auth->User('id');
$editprofile = $this->Profile->find('first',array(
'conditions'=>array('Profile.user_id'=>$profileedit),
'fields'=>array('id')));
$this->set(compact('editprofile'));
$this->loadModel('Profile');
$profileuse = $this->Auth->User('id');
$profile_area_pic = $this->Profile->find('first',array(
'conditions'=>array('Profile.user_id'=>$profileuse),
'fields'=>array('photo')));
$this->set(compact('profile_area_pic'));
【问题讨论】:
请不要用 1.3 和 2.x 标记它 - 只选择适用的主要版本!另外,为什么 loadModel() 两次?加载后,无需在同一个地方再次执行此操作。 感谢标记,注意,请忽略第二个 loadModel() 【参考方案1】:实现您正在尝试做的事情的更好方法是:
function beforeFilter()
if (!in_array($this->action, array('register','any_other_action',
'here'))
// Do your authentication or your profile query
只需尝试根据您的需要进行更改,在过滤之前检查它肯定会对您有所帮助。
【讨论】:
使用此实现显示个人资料图片,但在注册用户时仍然抛出相同的错误,还有其他建议吗? 请看***.com/questions/16999502/…提前谢谢liyakat【参考方案2】:function beforeFilter()
$this->set('editprofile', $this->_edit_profile());
function _edit_profile()
if($this->Auth->user('id'))
$this->loadModel('Profile');
$editprofile = $this->Profile->find('first',array(
'conditions'=>array('Profile.user_id'=>$this->Auth->user('id')), 'fields'=>array('id'))
);
if (!$editprofile || empty($editprofile)) return false;
return $editprofile;
return false;
【讨论】:
它会存储$this->Profile->find('first',array( 'conditions'=>array('Profile.user_id'=>$profileedit), 'fields'=>array('id')) );
的响应(如果可用)
我刚刚重读了您的评论并将答案调整为$this->Auth->user('id')
以上是关于在 CakePHP 2.x 中使变量可用于所有控制器的主要内容,如果未能解决你的问题,请参考以下文章
在 Storyboard 场景中使托管对象上下文可用于数组控制器