[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')) {
$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->replaceArgument(2, new Reference('debug.controller_resolver'));
@ -69,6 +72,9 @@ class FrameworkExtension extends Extension
$definition->setPublic(false);
$container->setDefinition('debug.event_dispatcher.parent', $definition);
$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);

View File

@ -9,7 +9,6 @@
<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.controller_resolver.class">Symfony\Component\HttpKernel\Controller\TraceableControllerResolver</parameter>
<parameter key="debug.debug_handlers_listener.class">Symfony\Component\HttpKernel\EventListener\DebugHandlersListener</parameter>
</parameters>
<services>
@ -26,27 +25,5 @@
<argument type="service" id="controller_resolver" />
<argument type="service" id="debug.stopwatch" />
</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>
</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">
<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>
<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="monolog.logger" channel="emergency" />
<argument>emergency</argument>
<tag name="monolog.logger" channel="php" />
<argument /><!-- Exception handler -->
<argument type="service" id="logger" on-invalid="null" />
<argument /><!-- Log levels map for enabled error levels -->
<argument>%kernel.debug%</argument>
</service>
</services>
</container>

View File

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

View File

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

View File

@ -11,33 +11,72 @@
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\HttpKernel\KernelEvents;
/**
* Configures the ExceptionHandler.
* Configures errors and exceptions handlers.
*
* @author Nicolas Grekas <p@tchwork.com>
*/
class DebugHandlersListener implements EventSubscriberInterface
{
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)) {
$this->exceptionHandler = $exceptionHandler;
}
$this->logger = $logger;
$this->levels = $levels;
$this->debug = $debug;
}
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) {
$handler = set_exception_handler('var_dump');
$handler = is_array($handler) ? $handler[0] : null;
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);
}
$this->exceptionHandler = null;

View File

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

View File

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