在 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 中使变量可用于所有控制器的主要内容,如果未能解决你的问题,请参考以下文章

在CakePHP中创建全局变量的最佳方法是什么?

在 Storyboard 场景中使托管对象上下文可用于数组控制器

CakePHP 4.x Authentication 2.x - 安装失败。您的要求无法解决为一组可安装的软件包

CakePHP 模型:可包含的 COUNT(*)

如何在 Python 中使私有变量可访问? [复制]

如何在控制器方法中使 JWT 令牌授权可选