8000 [FrameworkBundle] enable ErrorHandler in prod · symfony/symfony@5e43a69 · GitHub
[go: up one dir, main page]

Skip to content

Commit 5e43a69

Browse files
[FrameworkBundle] enable ErrorHandler in prod
1 parent 4b6776e commit 5e43a69

File tree

4 files changed

+51
-7
lines changed

4 files changed

+51
-7
lines changed

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,8 +133,6 @@ public function load(array $configs, ContainerBuilder $container)
133133
if ($container->getParameter('kernel.debug')) {
134134
$loader->load('debug.xml');
135135

136-
$definition->replaceArgument(0, array(new Reference('http_kernel', ContainerInterface::NULL_ON_INVALID_REFERENCE), 'terminateWithException'));
137-
138136
$definition = $container->findDefinition('http_kernel');
139137
$definition->replaceArgument(2, new Reference('debug.controller_resolver'));
140138

@@ -145,11 +143,15 @@ public function load(array $configs, ContainerBuilder $container)
145143
$container->setAlias('event_dispatcher', 'debug.event_dispatcher');
146144
} else {
147145
$definition->replaceArgument(2, E_COMPILE_ERROR | E_PARSE | E_ERROR | E_CORE_ERROR);
146+
147+
$container->findDefinition('debug.error_handler')->addMethodCall('throwAt', array(0));
148148
}
149149

150150
$this->addClassesToCompile(array(
151151
'Symfony\\Component\\Config\\FileLocator',
152152

153+
'Symfony\\Component\\Debug\\ErrorHandler',
154+
153155
'Symfony\\Component\\EventDispatcher\\Event',
154156
'Symfony\\Component\\EventDispatcher\\ContainerAwareEventDispatcher',
155157

src/Symfony/Bundle/FrameworkBundle/Resources/config/debug_prod.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
<parameters>
88
<parameter key="debug.debug_handlers_listener.class">Symfony\Component\HttpKernel\EventListener\DebugHandlersListener</parameter>
9+
<parameter key="debug.error_handler.class">Symfony\Component\Debug\ErrorHandler</parameter>
910
<parameter key="debug.stopwatch.class">Symfony\Component\Stopwatch\Stopwatch</parameter>
1011
</parameters>
1112

@@ -20,6 +21,8 @@
2021
<argument>null</argument><!-- %templating.helper.code.file_link_format% -->
2122
</service>
2223

24+
<service id="debug.error_handler" class="%debug.error_handler.class%" factory-class="%debug.error_handler.class%" factory-method="register" />
25+
2326
<service id="debug.stopwatch" class="%debug.stopwatch.class%" />
2427
</services>
2528
</container>

src/Symfony/Component/Debug/ErrorHandler.php

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,9 +124,15 @@ public static function register($levels = -1, $throw = true)
124124

125125
$handler = new static();
126126
$levels &= $handler->thrownErrors;
127-
set_error_handler(array($handler, 'handleError'), $levels);
127+
$prev = set_error_handler(array($handler, 'handleError'), $levels);
128+
$prev = is_array($prev) ? $prev[0] : null;
129+
if ($prev instanceof self) {
130+
restore_error_handler();
131+
$handler = $prev;
132+
} else {
133+
$handler->setExceptionHandler(set_exception_handler(array($handler, 'handleException')));
134+
}
128135
$handler->throwAt($throw ? $levels : 0, true);
129-
$handler->setExceptionHandler(set_exception_handler(array($handler, 'handleException')));
130136

131137
return $handler;
132138
}

src/Symfony/Component/HttpKernel/EventListener/DebugHandlersListener.php

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,14 @@
1414
use Psr\Log\LoggerInterface;
1515
use Symfony\Component\Debug\ErrorHandler;
1616
use Symfony\Component\Debug\ExceptionHandler;
17+
use Symfony\Component\EventDispatcher\Event;
18+
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
1719
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
20+
use Symfony\Component\HttpKernel\Event\KernelEvent;
1821
use Symfony\Component\HttpKernel\KernelEvents;
22+
use Symfony\Component\Console\ConsoleEvents;
23+
use Symfony\Component\Console\Event\ConsoleEvent;
24+
use Symfony\Component\Console\Output\ConsoleOutputInterface;
1925

2026
/**
2127
* Configures errors and exceptions handlers.
@@ -28,6 +34,7 @@ class DebugHandlersListener implements EventSubscriberInterface
2834
private $logger;
2935
private $levels;
3036
private $debug;
37+
private $fileLinkFormat;
3138

3239
/**
3340
* @param callable $exceptionHandler A handler that will be called on Exception
@@ -45,8 +52,18 @@ public function __construct($exceptionHandler, LoggerInterface $logger = null, $
4552
$this->fileLinkFormat = $fileLinkFormat ?: ini_get('xdebug.file_link_format') ?: get_cfg_var('xdebug.file_link_format');
4653
}
4754

48-
public function configure()
55+
/**
56+
* Configures the error handler.
57+
*
58+
* @param Event|null $event The triggering event
59+
* @param string|null $eventName The triggering event name
60+
* @param EventDispatcherInterface|null $eventDispatcher The dispatcher used to trigger $event
61+
*/
62+
public function configure(Event $event = null, $eventName = null, EventDispatcherInterface $eventDispatcher = null)
4963
{
64+
if (null !== $eventDispatcher) {
65+
$eventDispatcher->removeListener(array_keys(static::getSubscribedEvents()), array($this, 'configure'));
66+
}
5067
if ($this->logger) {
5168
$handler = set_error_handler('var_dump', 0);
5269
$handler = is_array($handler) ? $handler[0] : null;
@@ -65,7 +82,20 @@ public function configure()
6582
}
6683
$handler->screamAt($this->levels);
6784
}
68-
$this->logger = $this->levels = null;
85+
$this->logger = $this->levels = $this->debug = $this->fileLinkFormat = null;
86+
}
87+
if (!$this->exceptionHandler) {
88+
if ($event instanceof KernelEvent) {
89+
$this->exceptionHandler = array($event->getKernel(), 'terminateWithException');
90+
} elseif ($event instanceof ConsoleEvent && $app = $event->getCommand()->getApplication()) {
91+
$output = $event->getOutput();
92+
if ($output instanceof ConsoleOutputInterface) {
93+
$output = $output->getErrorOutput();
94+
}
95+
$this->exceptionHandler = function ($e) use ($app, $output) {
96+
$app->renderException($e, $output);
97+
};
98+
}
6999
}
70100
if ($this->exceptionHandler) {
71101
$handler = set_exception_handler('var_dump');
@@ -86,6 +116,9 @@ public function configure()
86116

87117
public static function getSubscribedEvents()
88118
{
89-
return array(KernelEvents::REQUEST => array('configure', 2048));
119+
return array(
120+
KernelEvents::REQUEST => array('configure', 2048),
121+
ConsoleEvents::COMMAND => array('configure', 2048),
122+
);
90123
}
91124
}

0 commit comments

Comments
 (0)
0