From 4a2f608f1efeeab84086c70d846799a3db6b60f8 Mon Sep 17 00:00:00 2001 From: David Maicher Date: Thu, 12 Oct 2017 14:26:49 +0200 Subject: [PATCH] [TwigBridge] fix BC for FormExtension if renderer is FormRenderer --- .../Bridge/Twig/Extension/FormExtension.php | 4 +- .../Tests/Extension/FormExtensionTest.php | 76 +++++++++++++++++++ src/Symfony/Bridge/Twig/composer.json | 1 + 3 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionTest.php diff --git a/src/Symfony/Bridge/Twig/Extension/FormExtension.php b/src/Symfony/Bridge/Twig/Extension/FormExtension.php index 945cd0bc37b1..d21601af76e7 100644 --- a/src/Symfony/Bridge/Twig/Extension/FormExtension.php +++ b/src/Symfony/Bridge/Twig/Extension/FormExtension.php @@ -54,7 +54,7 @@ public function initRuntime(Environment $environment) { if ($this->renderer instanceof TwigRendererInterface) { $this->renderer->setEnvironment($environment); - } elseif (null !== $this->renderer) { + } elseif (is_array($this->renderer)) { $this->renderer[2] = $environment; } } @@ -118,7 +118,7 @@ public function __get($name) if (is_array($this->renderer)) { $renderer = $this->renderer[0]->get($this->renderer[1]); - if (isset($this->renderer[2])) { + if (isset($this->renderer[2]) && $renderer instanceof TwigRendererInterface) { $renderer->setEnvironment($this->renderer[2]); } $this->renderer = $renderer; diff --git a/src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionTest.php b/src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionTest.php new file mode 100644 index 000000000000..a4d7350716e6 --- /dev/null +++ b/src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionTest.php @@ -0,0 +1,76 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Bridge\Twig\Tests\Extension; + +use PHPUnit\Framework\TestCase; +use Symfony\Bridge\Twig\Extension\FormExtension; +use Symfony\Bridge\Twig\Form\TwigRendererInterface; +use Symfony\Component\DependencyInjection\ContainerInterface; +use Symfony\Component\Form\FormRendererInterface; +use Twig\Environment; + +/** + * @group legacy + */ +class FormExtensionTest extends TestCase +{ + /** + * @dataProvider rendererDataProvider + */ + public function testInitRuntimeAndAccessRenderer($rendererConstructor, $expectedAccessedRenderer) + { + $extension = new FormExtension($rendererConstructor); + $extension->initRuntime($this->getMockBuilder(Environment::class)->disableOriginalConstructor()->getMock()); + $this->assertSame($expectedAccessedRenderer, $extension->renderer); + } + + /** + * @dataProvider rendererDataProvider + */ + public function testAccessRendererAndInitRuntime($rendererConstructor, $expectedAccessedRenderer) + { + $extension = new FormExtension($rendererConstructor); + $this->assertSame($expectedAccessedRenderer, $extension->renderer); + $extension->initRuntime($this->getMockBuilder(Environment::class)->disableOriginalConstructor()->getMock()); + } + + public function rendererDataProvider() + { + $twigRenderer = $this->getMockBuilder(TwigRendererInterface::class)->getMock(); + $twigRenderer->expects($this->once()) + ->method('setEnvironment'); + + yield array($twigRenderer, $twigRenderer); + + $twigRenderer = $this->getMockBuilder(TwigRendererInterface::class)->getMock(); + $twigRenderer->expects($this->once()) + ->method('setEnvironment'); + + $container = $this->getMockBuilder(ContainerInterface::class)->getMock(); + $container->expects($this->once()) + ->method('get') + ->with('service_id') + ->willReturn($twigRenderer); + + yield array(array($container, 'service_id'), $twigRenderer); + + $formRenderer = $this->getMockBuilder(FormRendererInterface::class)->getMock(); + + $container = $this->getMockBuilder(ContainerInterface::class)->getMock(); + $container->expects($this->once()) + ->method('get') + ->with('service_id') + ->willReturn($formRenderer); + + yield array(array($container, 'service_id'), $formRenderer); + } +} diff --git a/src/Symfony/Bridge/Twig/composer.json b/src/Symfony/Bridge/Twig/composer.json index e7e7e4889fc2..33ac7d5849c7 100644 --- a/src/Symfony/Bridge/Twig/composer.json +++ b/src/Symfony/Bridge/Twig/composer.json @@ -22,6 +22,7 @@ "require-dev": { "fig/link-util": "^1.0", "symfony/asset": "~2.8|~3.0|~4.0", + "symfony/dependency-injection": "~2.8|~3.0|~4.0", "symfony/finder": "~2.8|~3.0|~4.0", "symfony/form": "~3.4|~4.0", "symfony/http-foundation": "^3.3.11|~4.0",