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

时间:2012-01-27 23:09:32

标签: cakephp exception-handling cakephp-2.0

我使用过CakePHP 1.3,但这是我第一次尝试使用CakePHP 2.0和PHP异常,所以如果我的问题看起来很冗长,请耐心等待。

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

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

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

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

这一切都运行正常,我期待它时会收到403错误。但是,抛出异常时,不再设置AppController::beforeFilter()中设置的视图变量,从而导致视图模板出错。当异常 not 抛出时,变量设置正确。

如果必须的话,我可以编写缺失的变量,但我真的想知道是什么导致了这种行为。我的UsersControllerCakeErrorController都延伸AppController。当然,我希望在抛出异常并实例化CakeErrorController时,它会为我生成相同的视图变量。

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

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

所以:

  1. 这是CakePHP默认异常处理中的错误,
  2. 行为符合预期,我只是不理解,或
  3. 我疯了。
  4. 我知道你对案例3无能为力,但如果前两者中的任何一个适用,我会感谢那些比我更了解的人的意见。

    谢谢!

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

2 个答案:

答案 0 :(得分:4)

$this->set()的来电置于beforeRender()回调中。这样,即使你抛出异常,它们也会被设置。

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

答案 1 :(得分:3)

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