更新
想要使用每个控制器运行一些代码,并被告知使用Action Helpers或插件而不是从基本控制器扩展,我决定使用Action Helper而不是插件,@Bittarman(Ryan Mauger)的优秀幻灯片;
Zend Framework,掌握: http ://www.slideshare.net/rmauger/zend-framework-getting-to-grips参见幻灯片22:(动作助手)抛出的异常前/后调度将停止进一步执行......
虽然它会停止进一步执行,但没有发现异常.我一直试图调试这几个小时,但没有到达任何地方.
如果您运行以下代码,您是否看到异常被捕获或是否从错误控制器中逃脱?
我试图弄清楚Zend Framework是否表现不如预期,或者我是否完全搞砸了(更有可能).
我试图把它分解成最简单的情况来复制,让我知道你看到了什么:
/*添加到此处的现有Bootstrap:APPLICATION_PATH/Bootstrap.php*/
protected function _initActionHelpers() { Zend_Controller_Action_HelperBroker::addPath(APPLICATION_PATH .'/controllers/helpers'); //hooks cause action helper to autorun: http://akrabat.com/zend-framework/hooks-in-action-helpers/ $hooks = Zend_Controller_Action_HelperBroker::getStaticHelper('Test'); Zend_Controller_Action_HelperBroker::addHelper($hooks); }
/*in:APPLICATION_PATH/controllers/helpers/Test.php*/
更新: 好的,我一直在通过xDebug + Eclipse运行这个......(或者是那个或者玩得很开心,不知道我是否选择了更愉快的体验)....我发现了一些奇怪的东西.
preDispatch正在运行两次!在第二次调用时,它将转到Zend_Controller_Plugin/ErrorHandler.php,它运行此代码:
if ($this->_isInsideErrorHandlerLoop) { $exceptions = $response->getException(); if (count($exceptions) > $this->_exceptionCountAtFirstEncounter) { // Exception thrown by error handler; tell the front controller to throw it $frontController->throwExceptions(true); throw array_pop($exceptions); } }通过将throw Exceptions设置为true,它不再被捕获.而且我怀疑这是为了保存循环($ this - > _ isInsideErrorHandlerLoop也是一个微妙的线索;)
为什么它在循环中?
1> joedevon..:好的,@ Bittarman在IRC的#ZFTalk上给了我答案.在这里(并且道歉,我将自己的答案标记为正确..但我不想在这里写出更多的错误).
if( ($this->getRequest()->getActionName() == 'error') && ($this->getRequest()->getControllerName() == 'error')) { return; }原因是错误处理程序必须在错误处理程序循环中禁用自身(通过将throw异常设置为true).因此,您必须确保错误控制器中不会发生异常情况.