[TwigBundle] Only remove kernel exception listener if twig is used

This commit is contained in:
David Molineus 2020-09-29 23:35:47 +02:00 committed by Nicolas Grekas
parent 72ff4012a5
commit 7c34f6e866
2 changed files with 90 additions and 7 deletions

View File

@ -33,15 +33,19 @@ class ExceptionListenerPass implements CompilerPassInterface
// register the exception listener only if it's currently used, else use the provided by FrameworkBundle
if (null === $container->getParameter('twig.exception_listener.controller') && $container->hasDefinition('exception_listener')) {
$container->removeDefinition('twig.exception_listener');
} else {
$container->removeDefinition('exception_listener');
if ($container->hasParameter('templating.engines')) {
$engines = $container->getParameter('templating.engines');
if (!\in_array('twig', $engines, true)) {
$container->removeDefinition('twig.exception_listener');
}
return;
}
if ($container->hasParameter('templating.engines')) {
$engines = $container->getParameter('templating.engines');
if (\in_array('twig', $engines, true)) {
$container->removeDefinition('exception_listener');
return;
}
}
$container->removeDefinition('twig.exception_listener');
}
}

View File

@ -0,0 +1,79 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
declare(strict_types=1);
namespace Symfony\Bundle\TwigBundle\Tests\DependencyInjection\Compiler;
use PHPUnit\Framework\TestCase;
use Symfony\Bundle\TwigBundle\DependencyInjection\Compiler\ExceptionListenerPass;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\Security\Http\Firewall\ExceptionListener;
use Twig\Environment;
class ExceptionListenerPassTest extends TestCase
{
public function testExitsWhenTwigIsNotAvailable(): void
{
$builder = new ContainerBuilder();
$builder->register('exception_listener', ExceptionListener::class);
$builder->register('twig.exception_listener', ExceptionListener::class);
($pass = new ExceptionListenerPass())->process($builder);
$this->assertTrue($builder->hasDefinition('exception_listener'));
$this->assertTrue($builder->hasDefinition('twig.exception_listener'));
}
public function testRemovesTwigExceptionListenerWhenNoExceptionListenerControllerExists(): void
{
$builder = new ContainerBuilder();
$builder->register('twig', Environment::class);
$builder->register('exception_listener', ExceptionListener::class);
$builder->register('twig.exception_listener', ExceptionListener::class);
$builder->setParameter('twig.exception_listener.controller', null);
($pass = new ExceptionListenerPass())->process($builder);
$this->assertTrue($builder->hasDefinition('exception_listener'));
$this->assertFalse($builder->hasDefinition('twig.exception_listener'));
}
public function testRemovesTwigExceptionListenerIfTwigIsNotUsedAsTemplateEngine(): void
{
$builder = new ContainerBuilder();
$builder->register('twig', Environment::class);
$builder->register('exception_listener', ExceptionListener::class);
$builder->register('twig.exception_listener', ExceptionListener::class);
$builder->setParameter('twig.exception_listener.controller', 'exception_controller::showAction');
$builder->setParameter('templating.engines', ['php']);
($pass = new ExceptionListenerPass())->process($builder);
$this->assertTrue($builder->hasDefinition('exception_listener'));
$this->assertFalse($builder->hasDefinition('twig.exception_listener'));
}
public function testRemovesKernelExceptionListenerIfTwigIsUsedAsTemplateEngine(): void
{
$builder = new ContainerBuilder();
$builder->register('twig', Environment::class);
$builder->register('exception_listener', ExceptionListener::class);
$builder->register('twig.exception_listener', ExceptionListener::class);
$builder->setParameter('twig.exception_listener.controller', 'exception_controller::showAction');
$builder->setParameter('templating.engines', ['twig']);
($pass = new ExceptionListenerPass())->process($builder);
$this->assertFalse($builder->hasDefinition('exception_listener'));
$this->assertTrue($builder->hasDefinition('twig.exception_listener'));
}
}