【发布时间】:2012-01-27 23:09:31
【问题描述】:
我使用过 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() 中设置的视图变量不再设置,导致我的视图模板出错。当不抛出异常时,变量设置正确。
如果必须,我可以围绕缺少的变量进行编码,但我真的很想知道导致这种行为的原因。我的UsersController 和CakeErrorController 都扩展了AppController。当然,我希望当抛出异常并实例化 CakeErrorController 时,它会为我生成相同的视图变量。
然而,Controller::startupProcess() 方法(包括对beforeFilter() 的调用)似乎永远不会在CakeErrorController 上被调用。据我了解,这是由调度程序针对常规请求完成的,但错误控制器的生命周期不同。
我在 CakePHP 1.3 中看到过关于类似行为的描述 (like this one),但当然,CakePHP 的错误处理代码在 2.0 中已经彻底检修。
所以要么:
- 这是 CakePHP 的默认异常处理中的一个错误,
- 行为符合预期,我只是不明白,或者
- 我快疯了。
我知道您对第 3 种情况无能为力,但如果前两种中的任何一种适用,我会感谢比我了解更多的人的意见。
谢谢!
编辑:在beforeRender() 中设置视图变量确实解决了我的问题。但是,我仍然想知道 beforeFilter() 永远不会被 CakeErrorController 调用是否是故意的。
【问题讨论】:
-
+1 表示“我可能疯了”的自我诊断。
标签: cakephp exception-handling cakephp-2.0