如何在ZF2中使用框架异常处理来处理PHP7错误异常?
对于(Zend Framework)异常,我使用如下所示的简单机制:如何在ZF2中使用框架异常处理来处理PHP7错误异常?,php,events,error-handling,event-handling,zend-framework2,Php,Events,Error Handling,Event Handling,Zend Framework2,对于(Zend Framework)异常,我使用如下所示的简单机制: namespace Application; use Zend\Mvc\ModuleRouteListener; use Zend\Mvc\MvcEvent; use Zend\Log\Logger; class Module { public function onBootstrap(MvcEvent $e) { $eventManager = $e->getApplication(
namespace Application;
use Zend\Mvc\ModuleRouteListener;
use Zend\Mvc\MvcEvent;
use Zend\Log\Logger;
class Module
{
public function onBootstrap(MvcEvent $e)
{
$eventManager = $e->getApplication()->getEventManager();
$moduleRouteListener = new ModuleRouteListener();
$moduleRouteListener->attach($eventManager);
// ...
$this->initExceptionHandler($e);
}
public function initExceptionHandler($event)
{
$sharedManager = $event->getApplication()->getEventManager()->getSharedManager();
$serviceManager = $event->getApplication()->getServiceManager();
$sharedManager->attach(
'Zend\Mvc\Application',
[MvcEvent::EVENT_DISPATCH_ERROR, MvcEvent::EVENT_RENDER_ERROR],
function ($event) use($serviceManager) {
// error log
// ...
// error page
...
}
);
}
}
现在,我想实现本机PHP错误的错误处理。在PHP7中,“大多数错误现在都是通过抛出异常来报告的”(s.)。因此,它们很容易被捕获:使用try catch
块或通过
为了避免不必要的代码重复,我想将PHP错误异常“转换”为可以通过已经实现的机制捕获的异常。其思想是在MvcEvent
s中“包装”错误,并将它们转发给(框架)异常错误处理。到目前为止,我所尝试的:
// ...
class Module
{
public function onBootstrap(MvcEvent $e)
{
// ...
$this->initExceptionHandler($e);
$this->initErrorHandler($e);
}
// ...
public function initErrorHandler($event)
{
set_exception_handler(function (\Throwable $exception) use ($event) {
$event->getApplication()->getEventManager()->trigger(MvcEvent::EVENT_DISPATCH_ERROR, $event);
});
}
}
结果只有一个白色页面,没有错误消息(因此页面上没有任何内容,自定义错误日志中没有新内容,系统日志中没有新内容)
如何将PHP本机错误处理与(框架)异常处理对接/连接,以便错误触发错误事件并可以作为(框架)异常处理?
更新 日志记录的问题是,没有设置
$event#params['exception']
,因此行$serviceManager->get('ErrorLogger')->crit($event->getParam('exception'),$extra)无法执行模块35; initExceptionHandler(…)
中的code>。现在我正在手动设置$event
的此参数和一些其他参数:
public function initErrorHandler(MvcEvent $event)
{
set_exception_handler(function (\Throwable $exception) use ($event) {
$event->setError(Application::ERROR_EXCEPTION);
$routeMatch = $event->getRouteMatch();
$controllerName = 'Application\Controller\Error';
$event->setController($controllerName);
$controllerManager = $event->getApplication()->getServiceManager()->get('controller_manager'); // ->get('controllers');
$controller = $controllerManager->get($controllerName);
$event->setControllerClass(get_class($controller));
$event->setParam('exception', $exception);
$viewModel = new ViewModel();
$viewModel->setCaptureTo('content');
$viewModel->setTemplate('error/index');
$viewModel->setTerminal(false);
$viewModel->setVariables([
'message' => 'An error occurred during execution; please try again later.',
'display_exceptions' => true
]);
$event->setResult($viewModel);
// From this moment the framework exception handling starts and cares about the logging and displaying the error data.
// $event->getApplication()->getEventManager()->trigger(MvcEvent::EVENT_DISPATCH_ERROR, $event);
$event->setName(MvcEvent::EVENT_DISPATCH_ERROR);
$event->getApplication()->getEventManager()->triggerEvent($event);
return false;
});
}
这样我就可以让日志工作了。但在前端,我仍然得到一个空白页这里出了什么问题以及如何立即显示错误页面?
更新
我认为,这是一个可怕的逻辑错误——我试图在一个set\u exception\u处理程序(…)
调用之后处理一些框架内容。我看对了吗?如果是这样,它就不能这样工作如何解决这个难题/什么是解决办法?嗨@automatix,你的问题解决了吗?我很想知道解决办法。Cheers@automatix,你解决问题了吗?我很想知道解决办法。干杯