diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php index 15e0801fb9..f9146c242e 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php @@ -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); diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/debug.xml b/src/Symfony/Bundle/FrameworkBundle/Resources/config/debug.xml index c457e4f903..cdec776713 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/debug.xml +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/debug.xml @@ -9,7 +9,6 @@ Symfony\Component\Stopwatch\Stopwatch %kernel.cache_dir%/%kernel.container_class%.xml Symfony\Component\HttpKernel\Controller\TraceableControllerResolver - Symfony\Component\HttpKernel\EventListener\DebugHandlersListener @@ -26,27 +25,5 @@ - - - - - deprecation - - - - - - - scream - - - - - - - - terminateWithException - - diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/debug_prod.xml b/src/Symfony/Bundle/FrameworkBundle/Resources/config/debug_prod.xml index 36872ad529..4a842f31a9 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/debug_prod.xml +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/debug_prod.xml @@ -5,15 +5,17 @@ xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd"> - Symfony\Component\HttpKernel\EventListener\ErrorsLoggerListener + Symfony\Component\HttpKernel\EventListener\DebugHandlersListener - + - - emergency + + + + %kernel.debug% diff --git a/src/Symfony/Bundle/FrameworkBundle/composer.json b/src/Symfony/Bundle/FrameworkBundle/composer.json index f30def2e07..7cdb9b0da4 100644 --- a/src/Symfony/Bundle/FrameworkBundle/composer.json +++ b/src/Symfony/Bundle/FrameworkBundle/composer.json @@ -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", diff --git a/src/Symfony/Component/HttpKernel/CHANGELOG.md b/src/Symfony/Component/HttpKernel/CHANGELOG.md index 2b2e827d97..4d0b6149fd 100644 --- a/src/Symfony/Component/HttpKernel/CHANGELOG.md +++ b/src/Symfony/Component/HttpKernel/CHANGELOG.md @@ -1,6 +1,11 @@ CHANGELOG ========= +2.6.0 +----- + + * deprecated `Symfony\Component\HttpKernel\EventListener\ErrorsLoggerListener`, use `Symfony\Component\HttpKernel\EventListener\DebugHandlersListener` instead + 2.5.0 ----- diff --git a/src/Symfony/Component/HttpKernel/EventListener/DebugHandlersListener.php b/src/Symfony/Component/HttpKernel/EventListener/DebugHandlersListener.php index 4b7baf4ee5..3625c08c81 100644 --- a/src/Symfony/Component/HttpKernel/EventListener/DebugHandlersListener.php +++ b/src/Symfony/Component/HttpKernel/EventListener/DebugHandlersListener.php @@ -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 */ 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; diff --git a/src/Symfony/Component/HttpKernel/EventListener/ErrorsLoggerListener.php b/src/Symfony/Component/HttpKernel/EventListener/ErrorsLoggerListener.php index 025b6475a4..d5400b7d6e 100644 --- a/src/Symfony/Component/HttpKernel/EventListener/ErrorsLoggerListener.php +++ b/src/Symfony/Component/HttpKernel/EventListener/ErrorsLoggerListener.php @@ -21,6 +21,8 @@ use Symfony\Component\HttpKernel\KernelEvents; * * @author Colin Frei * @author Konstantin Myakshin + * + * @deprecated since 2.6, to be removed in 3.0. Use DebugHandlersListener instead. */ class ErrorsLoggerListener implements EventSubscriberInterface { diff --git a/src/Symfony/Component/HttpKernel/composer.json b/src/Symfony/Component/HttpKernel/composer.json index 20586c993e..e0e9ac1c20 100644 --- a/src/Symfony/Component/HttpKernel/composer.json +++ b/src/Symfony/Component/HttpKernel/composer.json @@ -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": {