Skip to content

Commit

Permalink
[TwigBridge] fix BC for FormExtension if renderer is FormRenderer
Browse files Browse the repository at this point in the history
  • Loading branch information
dmaicher authored and fabpot committed Oct 13, 2017
1 parent 0f5e38c commit 4a2f608
Show file tree
Hide file tree
Showing 3 changed files with 79 additions and 2 deletions.
4 changes: 2 additions & 2 deletions src/Symfony/Bridge/Twig/Extension/FormExtension.php
Expand Up @@ -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;
}
}
Expand Down Expand Up @@ -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;
Expand Down
76 changes: 76 additions & 0 deletions src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionTest.php
@@ -0,0 +1,76 @@
<?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.
*/

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);
}
}
1 change: 1 addition & 0 deletions src/Symfony/Bridge/Twig/composer.json
Expand Up @@ -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",
Expand Down

0 comments on commit 4a2f608

Please sign in to comment.