namespace Symfony\Component\HttpKernel\EventListener;
use Psr\Log\LoggerInterface;
+use Symfony\Component\Console\ConsoleEvents;
+use Symfony\Component\Console\Event\ConsoleEvent;
+use Symfony\Component\Console\Output\ConsoleOutputInterface;
use Symfony\Component\Debug\ErrorHandler;
use Symfony\Component\Debug\ExceptionHandler;
use Symfony\Component\EventDispatcher\Event;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\KernelEvent;
use Symfony\Component\HttpKernel\KernelEvents;
-use Symfony\Component\Console\ConsoleEvents;
-use Symfony\Component\Console\Event\ConsoleEvent;
-use Symfony\Component\Console\Output\ConsoleOutputInterface;
/**
* Configures errors and exceptions handlers.
private $fileLinkFormat;
private $scope;
private $firstCall = true;
+ private $hasTerminatedWithException;
/**
* @param callable|null $exceptionHandler A handler that will be called on Exception
/**
* Configures the error handler.
- *
- * @param Event|null $event The triggering event
*/
public function configure(Event $event = null)
{
- if (!$this->firstCall) {
+ if (!$event instanceof KernelEvent ? !$this->firstCall : !$event->isMasterRequest()) {
return;
}
- $this->firstCall = false;
+ $this->firstCall = $this->hasTerminatedWithException = false;
+
+ $handler = set_exception_handler('var_dump');
+ $handler = \is_array($handler) ? $handler[0] : null;
+ restore_exception_handler();
+
if ($this->logger || null !== $this->throwAt) {
- $handler = set_error_handler('var_dump');
- $handler = is_array($handler) ? $handler[0] : null;
- restore_error_handler();
if ($handler instanceof ErrorHandler) {
if ($this->logger) {
$handler->setDefaultLogger($this->logger, $this->levels);
- if (is_array($this->levels)) {
+ if (\is_array($this->levels)) {
$levels = 0;
foreach ($this->levels as $type => $log) {
$levels |= $type;
$handler->screamAt($levels);
}
if ($this->scope) {
- $handler->scopeAt($this->levels);
+ $handler->scopeAt($levels & ~E_USER_DEPRECATED & ~E_DEPRECATED);
} else {
$handler->scopeAt(0, true);
}
}
if (!$this->exceptionHandler) {
if ($event instanceof KernelEvent) {
- if (method_exists($event->getKernel(), 'terminateWithException')) {
- $this->exceptionHandler = array($event->getKernel(), 'terminateWithException');
+ if (method_exists($kernel = $event->getKernel(), 'terminateWithException')) {
+ $request = $event->getRequest();
+ $hasRun = &$this->hasTerminatedWithException;
+ $this->exceptionHandler = function (\Exception $e) use ($kernel, $request, &$hasRun) {
+ if ($hasRun) {
+ throw $e;
+ }
+ $hasRun = true;
+ $kernel->terminateWithException($e, $request);
+ };
}
} elseif ($event instanceof ConsoleEvent && $app = $event->getCommand()->getApplication()) {
$output = $event->getOutput();
}
}
if ($this->exceptionHandler) {
- $handler = set_exception_handler('var_dump');
- $handler = is_array($handler) ? $handler[0] : null;
- restore_exception_handler();
if ($handler instanceof ErrorHandler) {
- $h = $handler->setExceptionHandler('var_dump') ?: $this->exceptionHandler;
- $handler->setExceptionHandler($h);
- $handler = is_array($h) ? $h[0] : null;
+ $h = $handler->setExceptionHandler('var_dump');
+ if (\is_array($h) && $h[0] instanceof ExceptionHandler) {
+ $handler->setExceptionHandler($h);
+ $handler = $h[0];
+ } else {
+ $handler->setExceptionHandler($this->exceptionHandler);
+ }
}
if ($handler instanceof ExceptionHandler) {
$handler->setHandler($this->exceptionHandler);
{
$events = array(KernelEvents::REQUEST => array('configure', 2048));
- if ('cli' === PHP_SAPI && defined('Symfony\Component\Console\ConsoleEvents::COMMAND')) {
+ if ('cli' === \PHP_SAPI && \defined('Symfony\Component\Console\ConsoleEvents::COMMAND')) {
$events[ConsoleEvents::COMMAND] = array('configure', 2048);
}