适用于Zend Framework应用程序的有用的错误控制器类
任何应用程序的一项有用功能是报告发生的任何错误。ZendFramework带有一个不错的错误控制器系统,您可以通过创建ErrorController类来激活它。
以下是我使用的ErrorController类。它检测出发生了哪种类型的错误,并向用户显示一条消息。它还会将有关错误的详细报告通过电子邮件发送给服务器管理员。
class ErrorController extends Zend_Controller_Action { public function errorAction() { //确保使用默认的视图后缀,以便我们始终返回良好 //内容 $this->_helper->viewRenderer->setViewSuffix('phtml'); //从请求中获取错误对象 $errors = $this->_getParam('error_handler'); switch ($errors->type) { case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER: case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION: //404错误-找不到控制器或动作 $this->getResponse()->setHttpResponseCode(404); $this->view->message = 'Page not found'; $this->view->code = 404; if ($errors->type == Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER) { $this->view->info = sprintf( 'Unable to find controller "%s" in module "%s"', $errors->request->getControllerName(), $errors->request->getModuleName() ); } if ($errors->type == Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION) { $this->view->info = sprintf( 'Unable to find action "%s" in controller "%s" in module "%s"', $errors->request->getActionName(), $errors->request->getControllerName(), $errors->request->getModuleName() ); } break; case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION: default: //应用程序错误 $this->getResponse()->setHttpResponseCode(500); $this->view->message = 'Application error'; $this->view->code = 500; $this->view->info = $errors->exception; break; } //发送邮件让某人知道有问题! $config = Zend_Registry::get('configuration'); $tr = new Zend_Mail_Transport_Smtp($config->smtp); Zend_Mail::setDefaultTransport($tr); $mail = new Zend_Mail(); $emailBody = "An error occurred in the system. The error message contained the following output:\n\n"; $emailBody .= $this->view->message." (".$this->view->code.")\n\n"; $emailBody .= "Zend Error Type: ".$errors->type."\n\n"; $emailBody .= "REQUEST_URI: ".$_SERVER['REQUEST_URI']."\n\n"; if ( isset($_SERVER['HTTP_REFERER']) ) { $emailBody .= "HTTP_REFERER: ".$_SERVER['HTTP_REFERER']."\n\n"; } $emailBody .= "Stack trace: \n\n". $errors->exception->getTraceAsString()."\n\n"; //找到用户的罪魁祸首! $username = Zend_Auth::getInstance()->getIdentity(); $emailBody .= "This error was created by ".$username."."; $mail->setBodyText($emailBody); $mail->setFrom('[email protected]', ''); $mail->addTo($config->adminEmail, $config->adminName); $mail->setSubject('An Error Occured'); //电子邮件 $mail->send(); $this->view->title = 'Error!'; $this->view->heading = 'Error!'; //将环境传递给视图脚本,以便我们可以有条件地 //显示更多/更少信息 $this->view->env = $this->getInvokeArg('env'); //将实际的异常对象传递给视图 $this->view->exception = $errors->exception; //将请求传递给视图 $this->view->request = $errors->request; } }
此错误控制器依赖于配置文件中已设置的某些选项。将以下选项添加到您的配置文件中,以使这些选项起作用。
smtp = my.smtpserver.com adminEmail = [email protected] adminName = 'Your name'
要启用此throwExceptions()功能,只需调用Zend_Controller_Front的函数并将其值传递为false。这将导致框架寻找错误控制器,而不是尝试打印出东西。
最后,您需要添加一个视图,以便您的错误将得到很好的显示。如果环境设置为“测试”,它将显示更多。
Error has happened. Inside this application. Sorry about that.
=$this->message ?> (=$this->code ?>)
if( $this->env == 'test' ) { if ( isset($this->info ) ) { ?> if ( 404 == $this->code ) { ?>Reason: = $this->info ?>
} elseif (500 == $this->code) { ?>Bad server, naughty server!
No donut for you!Exception information:
Message: = $this->info->getMessage() ?>
Stack trace:
= $this->info->getTraceAsString() ?>} ?> } ?> } ?>