события — Как обрабатывать PHP 7 Исключения ошибок с помощью обработки исключений платформы в ZF2?

Для исключений (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()->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. В PHP 7 «о большинстве ошибок теперь сообщают, бросая ошибка исключения«(с. Вот). Так что их легко поймать: либо с try-catch блок или через set_exception_handler(...).

Чтобы избежать ненужного дублирования кода, я хочу «преобразовать» исключения ошибок PHP в исключения, перехватываемые уже реализованным механизмом. Идея состоит в том, чтобы «обернуть» ошибки в MvcEvents и перенаправить их на обработку ошибок (framework). Что я пробовал до сих пор:

// ...
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);
});
}
}

В результате получается только белая страница и никаких сообщений об ошибках (поэтому ничего на странице, ничего нового в пользовательском журнале ошибок, ничего нового в syslog).

Как прикрепить / подключить встроенную обработку ошибок PHP к обработке исключений (фреймворка), чтобы ошибки вызывали срабатывание событий ошибок и могли обрабатываться как исключения (фреймворка)?


ОБНОВИТЬ

Проблема с регистрацией была в том, что $event#params['exception'] не было установлено, поэтому линия $serviceManager->get('ErrorLogger')->crit($event->getParam('exception'), $extra); в Module#initExceptionHandler(...) не может быть выполнен Сейчас я устанавливаю этот и некоторые другие параметры $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_exception_handler(...) вызов. Я правильно вижу? Если так, это не может работать таким образом. Как решить эту дилемму / Что такое обходной путь?

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector