在我的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()中设置视图变量确实解决了我的问题.但是,我仍然想知道在CakeErrorController上是否永远不会调用beforeFilter().