我使用过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 抛出时,变量设置正确。
如果必须的话,我可以编写缺失的变量,但我真的想知道是什么导致了这种行为。我的UsersController
和CakeErrorController
都延伸AppController
。当然,我希望在抛出异常并实例化CakeErrorController
时,它会为我生成相同的视图变量。
但是,似乎Controller::startupProcess()
方法(包括对beforeFilter()
的调用)永远不会在CakeErrorController
上调用。据我了解,这是由调度员对常规请求完成的,但错误控制器的生命周期是不同的。
我在CakePHP 1.3中看到了类似行为的描述(like this one),但当然CakePHP的错误处理代码已经在2.0中彻底改变了。
所以:
我知道你对案例3无能为力,但如果前两者中的任何一个适用,我会感谢那些比我更了解的人的意见。
谢谢!
编辑:在beforeRender()
中设置视图变量确实解决了我的问题。但是,我仍然想知道beforeFilter()
是否故意CakeErrorController
永远不会被{{1}}调用。
答案 0 :(得分:4)
将$this->set()
的来电置于beforeRender()
回调中。这样,即使你抛出异常,它们也会被设置。
我自己也遇到了一些自定义布局变量的问题,就像DebugKit一样,每当出现任何类型的错误时,我的页面都会填充未声明的变量警告。使用beforeRender()
代替修复它。
答案 1 :(得分:3)
你可以通过将CakeErrorController.php复制到App / Controller /来覆盖它 然后将parent :: beforeFilter()添加到构造函数中。