【问题标题】:CakePHP 2.0 - beforeFilter() not run on cakeErrorController?CakePHP 2.0 - beforeFilter() 不在 cakeErrorController 上运行?
【发布时间】:2012-01-27 23:09:31
【问题描述】:

我使用过 CakePHP 1.3,但这是我第一次涉足 CakePHP 2.0 和 PHP 异常,所以如果我的问题显得冗长,请耐心等待。

在我的AppControllerbeforeFilter() 中,我通过$this->set() 设置了几个变量以用于我的视图模板。

在我的UsersController 中,我的代码大致如下:

public function beforeFilter() {
  parent::beforeFilter();
  if (userDeniedAccess()) {
    throw new ForbiddenException();
  }
}

假设函数userDeniedAccess() 封装了我的授权检查。

这一切都很好,当我期望它时,我得到了 403 错误。但是,当抛出异常时,AppController::beforeFilter() 中设置的视图变量不再设置,导致我的视​​图模板出错。当抛出异常时,变量设置正确。

如果必须,我可以围绕缺少的变量进行编码,但我真的很想知道导致这种行为的原因。我的UsersControllerCakeErrorController 都扩展了AppController。当然,我希望当抛出异常并实例化 CakeErrorController 时,它会为我生成相同的视图变量。

然而,Controller::startupProcess() 方法(包括对beforeFilter() 的调用)似乎永远不会在CakeErrorController 上被调用。据我了解,这是由调度程序针对常规请求完成的,但错误控制器的生命周期不同。

我在 CakePHP 1.3 中看到过关于类似行为的描述 (like this one),但当然,CakePHP 的错误处理代码在 2.0 中已经彻底检修。

所以要么:

  1. 这是 CakePHP 的默认异常处理中的一个错误,
  2. 行为符合预期,我只是不明白,或者
  3. 我快疯了。

我知道您对第 3 种情况无能为力,但如果前两种中的任何一种适用,我会感谢比我了解更多的人的意见。

谢谢!

编辑:beforeRender() 中设置视图变量确实解决了我的问题。但是,我仍然想知道 beforeFilter() 永远不会被 CakeErrorController 调用是否是故意的。

【问题讨论】:

  • +1 表示“我可能疯了”的自我诊断。

标签: cakephp exception-handling cakephp-2.0


【解决方案1】:

将对$this->set() 的调用放入beforeRender() 回调中。这样,即使您抛出异常,它们也会始终被设置。

我自己也遇到了一些自定义布局变量的问题,就像使用 DebugKit 一样,只要出现任何类型的错误,我的页面就会充满未声明的变量警告。改用beforeRender() 修复它。

【讨论】:

  • +1 以获得有见地的答案——但我不确定这是否对我有用,因为 beforeRender() 在操作逻辑之后运行。由于我正在进行授权检查,因此我不希望操作逻辑在失败时运行。
  • 转念一想,这没有任何意义。当然我可以在beforeFilter() 中抛出我的异常,并在beforeRender() 中设置视图变量。我已经接受了这个答案,因为它解决了我的直接问题,但我仍然想知道这是否是错误控制器上未调用 beforeFilter() 的错误。
【解决方案2】:

您可以通过将 CakeErrorController.php 复制到 App/Controller/ 来覆盖它 然后将 parent::beforeFilter() 添加到构造函数中。

【讨论】:

  • 谢谢,这当然是一个有用的选择。不过,这感觉有点骇人听闻。在这一点上,我的代码已经完成了它需要做的事情。我仍然想了解为什么异常处理进程从不调用startupProcess() 上的CakeErrorController,就像调度程序在其他控制器上调用它的方式一样。
猜你喜欢
  • 2014-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-11
相关资源
最近更新 更多