[Debug] update FrameworkBundle and HttpKernel for new ErrorHandler

This commit is contained in:
Nicolas Grekas 2014-05-26 12:39:46 +02:00
parent 839e9ac4c4
commit 1701447c85
8 changed files with 64 additions and 33 deletions

View File

@ -61,6 +61,9 @@ class FrameworkExtension extends Extension
if ($container->getParameter('kernel.debug')) { if ($container->getParameter('kernel.debug')) {
$loader->load('debug.xml'); $loader->load('debug.xml');
$definition = $container->findDefinition('debug.debug_handlers_listener');
$definition->replaceArgument(0, array(new Reference('http_kernel', ContainerInterface::NULL_ON_INVALID_REFERENCE), 'terminateWithException'));
$definition = $container->findDefinition('http_kernel'); $definition = $container->findDefinition('http_kernel');
$definition->replaceArgument(2, new Reference('debug.controller_resolver')); $definition->replaceArgument(2, new Reference('debug.controller_resolver'));
@ -69,6 +72,9 @@ class FrameworkExtension extends Extension
$definition->setPublic(false); $definition->setPublic(false);
$container->setDefinition('debug.event_dispatcher.parent', $definition); $container->setDefinition('debug.event_dispatcher.parent', $definition);
$container->setAlias('event_dispatcher', 'debug.event_dispatcher'); $container->setAlias('event_dispatcher', 'debug.event_dispatcher');
} else {
$definition = $container->findDefinition('debug.debug_handlers_listener');
$definition->replaceArgument(2, E_COMPILE_ERROR | E_PARSE | E_ERROR | E_CORE_ERROR);
} }
$configuration = $this->getConfiguration($configs, $container); $configuration = $this->getConfiguration($configs, $container);

View File

@ -9,7 +9,6 @@
<parameter key="debug.stopwatch.class">Symfony\Component\Stopwatch\Stopwatch</parameter> <parameter key="debug.stopwatch.class">Symfony\Component\Stopwatch\Stopwatch</parameter>
<parameter key="debug.container.dump">%kernel.cache_dir%/%kernel.container_class%.xml</parameter> <parameter key="debug.container.dump">%kernel.cache_dir%/%kernel.container_class%.xml</parameter>
<parameter key="debug.controller_resolver.class">Symfony\Component\HttpKernel\Controller\TraceableControllerResolver</parameter> <parameter key="debug.controller_resolver.class">Symfony\Component\HttpKernel\Controller\TraceableControllerResolver</parameter>
<parameter key="debug.debug_handlers_listener.class">Symfony\Component\HttpKernel\EventListener\DebugHandlersListener</parameter>
</parameters> </parameters>
<services> <services>
@ -26,27 +25,5 @@
<argument type="service" id="controller_resolver" /> <argument type="service" id="controller_resolver" />
<argument type="service" id="debug.stopwatch" /> <argument type="service" id="debug.stopwatch" />
</service> </service>
<service id="debug.deprecation_logger_listener" class="%debug.errors_logger_listener.class%">
<tag name="kernel.event_subscriber" />
<tag name="monolog.logger" channel="deprecation" />
<argument>deprecation</argument>
<argument type="service" id="logger" on-invalid="null" />
</service>
<service id="debug.scream_logger_listener" class="%debug.errors_logger_listener.class%">
<tag name="kernel.event_subscriber" />
<tag name="monolog.logger" channel="scream" />
<argument>scream</argument>
<argument type="service" id="logger" on-invalid="null" />
</service>
<service id="debug.debug_handlers_listener" class="%debug.debug_handlers_listener.class%">
<tag name="kernel.event_subscriber" />
<argument type="collection">
<argument type="service" id="http_kernel" on-invalid="null" />
<argument>terminateWithException</argument>
</argument>
</service>
</services> </services>
</container> </container>

View File

@ -5,15 +5,17 @@
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd"> xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
<parameters> <parameters>
<parameter key="debug.errors_logger_listener.class">Symfony\Component\HttpKernel\EventListener\ErrorsLoggerListener</parameter> <parameter key="debug.debug_handlers_listener.class">Symfony\Component\HttpKernel\EventListener\DebugHandlersListener</parameter>
</parameters> </parameters>
<services> <services>
<service id="debug.emergency_logger_listener" class="%debug.errors_logger_listener.class%"> <service id="debug.debug_handlers_listener" class="%debug.debug_handlers_listener.class%">
<tag name="kernel.event_subscriber" /> <tag name="kernel.event_subscriber" />
<tag name="monolog.logger" channel="emergency" /> <tag name="monolog.logger" channel="php" />
<argument>emergency</argument> <argument /><!-- Exception handler -->
<argument type="service" id="logger" on-invalid="null" /> <argument type="service" id="logger" on-invalid="null" />
<argument /><!-- Log levels map for enabled error levels -->
<argument>%kernel.debug%</argument>
</service> </service>
</services> </services>
</container> </container>

View File

@ -21,7 +21,7 @@
"symfony/config" : "~2.4", "symfony/config" : "~2.4",
"symfony/event-dispatcher": "~2.5", "symfony/event-dispatcher": "~2.5",
"symfony/http-foundation": "~2.4", "symfony/http-foundation": "~2.4",
"symfony/http-kernel": "~2.5", "symfony/http-kernel": "~2.6",
"symfony/filesystem": "~2.3", "symfony/filesystem": "~2.3",
"symfony/routing": "~2.2", "symfony/routing": "~2.2",
"symfony/security-core": "~2.4", "symfony/security-core": "~2.4",

View File

@ -1,6 +1,11 @@
CHANGELOG CHANGELOG
========= =========
2.6.0
-----
* deprecated `Symfony\Component\HttpKernel\EventListener\ErrorsLoggerListener`, use `Symfony\Component\HttpKernel\EventListener\DebugHandlersListener` instead
2.5.0 2.5.0
----- -----

View File

@ -11,33 +11,72 @@
namespace Symfony\Component\HttpKernel\EventListener; namespace Symfony\Component\HttpKernel\EventListener;
use Symfony\Component\Debug\ExceptionHandler; use Psr\Log\LoggerInterface;
use Symfony\Component\Debug\ErrorHandler;
use Symfony\Component\Debug\AbstractExceptionHandler;
use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\KernelEvents; use Symfony\Component\HttpKernel\KernelEvents;
/** /**
* Configures the ExceptionHandler. * Configures errors and exceptions handlers.
* *
* @author Nicolas Grekas <p@tchwork.com> * @author Nicolas Grekas <p@tchwork.com>
*/ */
class DebugHandlersListener implements EventSubscriberInterface class DebugHandlersListener implements EventSubscriberInterface
{ {
private $exceptionHandler; private $exceptionHandler;
private $logger;
private $levels;
private $debug;
public function __construct($exceptionHandler) /**
* @param callable $exceptionHandler A handler that will be called on Exception
* @param LoggerInterface|null $logger A PSR-3 logger
* @param array|int $levels An array map of E_* to LogLevel::* or an integer bit field of E_* constants
* @param bool $debug Enables/disables debug mode
*/
public function __construct($exceptionHandler, LoggerInterface $logger = null, $levels = null, $debug = true)
{ {
if (is_callable($exceptionHandler)) { if (is_callable($exceptionHandler)) {
$this->exceptionHandler = $exceptionHandler; $this->exceptionHandler = $exceptionHandler;
} }
$this->logger = $logger;
$this->levels = $levels;
$this->debug = $debug;
} }
public function configure() public function configure()
{ {
if ($this->logger) {
$handler = set_error_handler('var_dump', 0);
$handler = is_array($handler) ? $handler[0] : null;
restore_error_handler();
if ($handler instanceof ErrorHandler) {
if ($this->debug) {
$handler->throwAt(-1);
}
$handler->setDefaultLogger($this->logger, $this->levels);
if (is_array($this->levels)) {
$scream = 0;
foreach ($this->levels as $type => $log) {
$scream |= $type;
}
$this->levels = $scream;
}
$handler->screamAt($this->levels);
}
$this->logger = $this->levels = null;
}
if ($this->exceptionHandler) { if ($this->exceptionHandler) {
$handler = set_exception_handler('var_dump'); $handler = set_exception_handler('var_dump');
$handler = is_array($handler) ? $handler[0] : null; $handler = is_array($handler) ? $handler[0] : null;
restore_exception_handler(); restore_exception_handler();
if ($handler instanceof ExceptionHandler) { if ($handler instanceof ErrorHandler) {
$h = $handler->setExceptionHandler('var_dump') ?: $this->exceptionHandler;
$handler->setExceptionHandler($h);
$handler = is_array($h) ? $h[0] : null;
}
if ($handler instanceof AbstractExceptionHandler) {
$handler->setHandler($this->exceptionHandler); $handler->setHandler($this->exceptionHandler);
} }
$this->exceptionHandler = null; $this->exceptionHandler = null;

View File

@ -21,6 +21,8 @@ use Symfony\Component\HttpKernel\KernelEvents;
* *
* @author Colin Frei <colin@colinfrei.com> * @author Colin Frei <colin@colinfrei.com>
* @author Konstantin Myakshin <koc-dp@yandex.ru> * @author Konstantin Myakshin <koc-dp@yandex.ru>
*
* @deprecated since 2.6, to be removed in 3.0. Use DebugHandlersListener instead.
*/ */
class ErrorsLoggerListener implements EventSubscriberInterface class ErrorsLoggerListener implements EventSubscriberInterface
{ {

View File

@ -19,7 +19,7 @@
"php": ">=5.3.3", "php": ">=5.3.3",
"symfony/event-dispatcher": "~2.5", "symfony/event-dispatcher": "~2.5",
"symfony/http-foundation": "~2.4", "symfony/http-foundation": "~2.4",
"symfony/debug": "~2.5", "symfony/debug": "~2.6",
"psr/log": "~1.0" "psr/log": "~1.0"
}, },
"require-dev": { "require-dev": {