diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/web.xml b/src/Symfony/Bundle/FrameworkBundle/Resources/config/web.xml
index f6dd2bb9df630..58882f2643103 100644
--- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/web.xml
+++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/web.xml
@@ -75,6 +75,7 @@
%kernel.debug%
%kernel.charset%
%debug.file_link_format%
+
diff --git a/src/Symfony/Bundle/SecurityBundle/DependencyInjection/SecurityExtension.php b/src/Symfony/Bundle/SecurityBundle/DependencyInjection/SecurityExtension.php
index f0d8c0dc5a526..e8a12d82c7d9d 100644
--- a/src/Symfony/Bundle/SecurityBundle/DependencyInjection/SecurityExtension.php
+++ b/src/Symfony/Bundle/SecurityBundle/DependencyInjection/SecurityExtension.php
@@ -19,6 +19,7 @@
use Symfony\Component\DependencyInjection\Alias;
use Symfony\Component\DependencyInjection\Argument\IteratorArgument;
use Symfony\Component\DependencyInjection\ChildDefinition;
+use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\Compiler\ServiceLocatorTagPass;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
@@ -28,6 +29,9 @@
use Symfony\Component\Config\FileLocator;
use Symfony\Component\Security\Core\Authorization\Voter\VoterInterface;
use Symfony\Component\Security\Core\Encoder\Argon2iPasswordEncoder;
+use Symfony\Component\Security\Core\Exception\AccessDeniedException;
+use Symfony\Component\Security\Core\Exception\AuthenticationException;
+use Symfony\Component\Security\Core\Exception\LogoutException;
use Symfony\Component\Security\Core\User\UserProviderInterface;
use Symfony\Component\Security\Http\Controller\UserValueResolver;
@@ -37,7 +41,7 @@
* @author Fabien Potencier
* @author Johannes M. Schmitt
*/
-class SecurityExtension extends Extension
+class SecurityExtension extends Extension implements CompilerPassInterface
{
private $requestMatchers = array();
private $expressions = array();
@@ -121,6 +125,21 @@ public function load(array $configs, ContainerBuilder $container)
->addTag('security.voter');
}
+ public function process(ContainerBuilder $container)
+ {
+ $silentExceptions = array(
+ AuthenticationException::class,
+ AccessDeniedException::class,
+ LogoutException::class,
+ );
+ if ($container->hasDefinition('http_exception_listener') && 6 === count(($definition = $container->getDefinition('http_exception_listener'))->getArguments())) {
+ $definition->replaceArgument(5, array_merge($definition->getArgument(5), $silentExceptions));
+ }
+ if ($container->hasDefinition('twig.exception_listener') && 6 === count(($definition = $container->getDefinition('twig.exception_listener'))->getArguments())) {
+ $definition->replaceArgument(5, array_merge($definition->getArgument(5), $silentExceptions));
+ }
+ }
+
private function createRoleHierarchy(array $config, ContainerBuilder $container)
{
if (!isset($config['role_hierarchy']) || 0 === count($config['role_hierarchy'])) {
diff --git a/src/Symfony/Bundle/TwigBundle/Resources/config/twig.xml b/src/Symfony/Bundle/TwigBundle/Resources/config/twig.xml
index fca4367ba743c..9ec691c2f42d5 100644
--- a/src/Symfony/Bundle/TwigBundle/Resources/config/twig.xml
+++ b/src/Symfony/Bundle/TwigBundle/Resources/config/twig.xml
@@ -129,6 +129,9 @@
%twig.exception_listener.controller%
%kernel.debug%
+ %kernel.charset%
+ %debug.file_link_format%
+
diff --git a/src/Symfony/Component/HttpKernel/EventListener/ExceptionListener.php b/src/Symfony/Component/HttpKernel/EventListener/ExceptionListener.php
index 430a6f9196951..be26581856af0 100644
--- a/src/Symfony/Component/HttpKernel/EventListener/ExceptionListener.php
+++ b/src/Symfony/Component/HttpKernel/EventListener/ExceptionListener.php
@@ -37,20 +37,28 @@ class ExceptionListener implements EventSubscriberInterface
protected $debug;
private $charset;
private $fileLinkFormat;
+ private $silentIgnore;
- public function __construct($controller, LoggerInterface $logger = null, $debug = false, $charset = null, $fileLinkFormat = null)
+ public function __construct($controller, LoggerInterface $logger = null, $debug = false, $charset = null, $fileLinkFormat = null, array $silentIgnore = array())
{
$this->controller = $controller;
$this->logger = $logger;
$this->debug = $debug;
$this->charset = $charset;
$this->fileLinkFormat = $fileLinkFormat;
+ $this->silentIgnore = $silentIgnore;
}
public function logKernelException(GetResponseForExceptionEvent $event)
{
- $exception = $event->getException();
- $request = $event->getRequest();
+ $exception = $prev = $event->getException();
+ do {
+ foreach ($this->silentIgnore as $class) {
+ if ($prev instanceof $class) {
+ return;
+ }
+ }
+ } while (null !== $prev = $exception->getPrevious());
$this->logException($exception, sprintf('Uncaught PHP Exception %s: "%s" at %s line %s', get_class($exception), $exception->getMessage(), $exception->getFile(), $exception->getLine()));
}