bug #24535 [TwigBridge] fix BC for FormExtension if renderer is FormRenderer (dmaicher)

This PR was squashed before being merged into the 3.4 branch (closes #24535).

Discussion
----------

[TwigBridge] fix BC for FormExtension if renderer is FormRenderer

| Q             | A
| ------------- | ---
| Branch?       | 3.4
| Bug fix?      | yes
| New feature?  | no
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets | https://github.com/symfony/symfony/issues/24533
| License       | MIT
| Doc PR        | -

This fixes some issues within FormExtension since the renderer is now a `FormRenderer`.

Commits
-------

4a2f608f1e [TwigBridge] fix BC for FormExtension if renderer is FormRenderer
This commit is contained in:
Fabien Potencier 2017-10-13 06:28:25 -07:00
commit ac6d605659
3 changed files with 79 additions and 2 deletions

View File

@ -54,7 +54,7 @@ class FormExtension extends AbstractExtension implements InitRuntimeInterface
{
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 @@ class FormExtension extends AbstractExtension implements InitRuntimeInterface
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;

View File

@ -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);
}
}

View File

@ -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",