CakePHP 2.0 - beforeFilter()无法在cakeErrorController上运行?

eaj*_*eaj 8 cakephp exception-handling cakephp-2.0

我曾经使用CakePHP 1.3,但这是我第一次涉及CakePHP 2.0和PHP异常,所以如果我的问题看起来很罗嗦,请耐心等待.

在我AppControllerbeforeFilter()设置中,我设置了几个变量,$this->set()以便在我的视图模板中使用.

在我的UsersController代码中看起来大致如下:

public function beforeFilter() {
  parent::beforeFilter();
  if (userDeniedAccess()) {
    throw new ForbiddenException();
  }
}
Run Code Online (Sandbox Code Playgroud)

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

这一切都很好,我期待它时会收到403错误.但是,抛出异常时,AppController::beforeFilter()不再设置已设置的视图变量,从而导致视图模板出错.如果抛出异常,则会正确设置变量.

如果必须的话,我可以编写缺失的变量,但我真的想知道导致这种行为的原因.我UsersController和他的CakeErrorController延伸AppController.当然,我希望当抛出异常并CakeErrorController实例化时,它会为我生成相同的视图变量.

但是,似乎永远不会Controller::startupProcess()调用该方法(包括调用beforeFilter())CakeErrorController.据我所知,这是由调度员对常规请求完成的,但错误控制器的生命周期是不同的.

我在CakePHP 1.3中看到了类似行为的描述(如此),但当然CakePHP的错误处理代码已经在2.0中彻底改变了.

所以要么:

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

我知道你对案例3无能为力,但如果前两个中的任何一个适用,我会感谢那些比我更了解的人的意见.

谢谢!

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

mrl*_*lee 4

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

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