diff --git a/core/lib/Drupal/Core/CoreBundle.php b/core/lib/Drupal/Core/CoreBundle.php index ed15dd535ae53b0b84a651280e3d41a233f722db..f1e43d64c31d63a0b45a9675f5a4a499a1bcbc0a 100644 --- a/core/lib/Drupal/Core/CoreBundle.php +++ b/core/lib/Drupal/Core/CoreBundle.php @@ -119,7 +119,7 @@ public function build(ContainerBuilder $container) { $container->register('request_close_subscriber', 'Drupal\Core\EventSubscriber\RequestCloseSubscriber') ->addTag('kernel.event_subscriber'); $container->register('config_global_override_subscriber', '\Drupal\Core\EventSubscriber\ConfigGlobalOverrideSubscriber'); - $container->register('exception_listener', 'Symfony\Component\HttpKernel\EventListener\ExceptionListener') + $container->register('exception_listener', 'Drupal\Core\EventSubscriber\ExceptionListener') ->addTag('kernel.event_subscriber') ->addArgument(new Reference('service_container')) ->setFactoryClass('Drupal\Core\ExceptionController') diff --git a/core/lib/Drupal/Core/EventSubscriber/ExceptionListener.php b/core/lib/Drupal/Core/EventSubscriber/ExceptionListener.php new file mode 100644 index 0000000000000000000000000000000000000000..f71b35136caf5495ccc49a3a27ae88202ee2b466 --- /dev/null +++ b/core/lib/Drupal/Core/EventSubscriber/ExceptionListener.php @@ -0,0 +1,83 @@ +controller = $controller; + } + + public function onKernelException(GetResponseForExceptionEvent $event) { + static $handling; + + if ($handling) { + return FALSE; + } + + $handling = TRUE; + + $exception = $event->getException(); + $request = $event->getRequest(); + // Do not put a line in the server logs for every HTTP error. + if (!$exception instanceof HttpExceptionInterface || $exception->getStatusCode() >= 500) { + error_log(sprintf('Uncaught PHP Exception %s: "%s" at %s line %s', get_class($exception), $exception->getMessage(), $exception->getFile(), $exception->getLine())); + } + + $attributes = array( + '_controller' => $this->controller, + 'exception' => FlattenException::create($exception), + 'logger' => NULL, + 'format' => $request->getRequestFormat(), + ); + + $request = $request->duplicate(NULL, NULL, $attributes); + $request->setMethod('GET'); + + try { + $response = $event->getKernel()->handle($request, HttpKernelInterface::SUB_REQUEST, TRUE); + } + catch (\Exception $e) { + $message = sprintf('Exception thrown when handling an exception (%s: %s)', get_class($e), $e->getMessage()); + error_log($message); + // Set handling to false otherwise it won't be able to handle further + // exceptions. + $handling = FALSE; + return; + } + + $event->setResponse($response); + $handling = FALSE; + } + + public static function getSubscribedEvents() { + return array( + KernelEvents::EXCEPTION => array('onKernelException', -128), + ); + } +} diff --git a/core/lib/Drupal/Core/ExceptionController.php b/core/lib/Drupal/Core/ExceptionController.php index 20c9ec2894bc71d5817045c5c9d9be242fea76dd..cb448dec841fd7a2133d988d0c9641d6ff7fd04e 100644 --- a/core/lib/Drupal/Core/ExceptionController.php +++ b/core/lib/Drupal/Core/ExceptionController.php @@ -12,9 +12,8 @@ use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\JsonResponse; -use Drupal\Core\HttpKernel; use Symfony\Component\HttpKernel\Exception\FlattenException; -use Symfony\Component\HttpKernel\EventListener\ExceptionListener; +use Drupal\Core\EventSubscriber\ExceptionListener; /** * This controller handles HTTP errors generated by the routing system.