fixed circular reference in Twig Form integration

This commit is contained in:
Fabien Potencier 2016-09-29 12:32:38 -07:00
parent 4b5e412d2c
commit b515702fc9
10 changed files with 61 additions and 41 deletions

View File

@ -1,6 +1,12 @@
CHANGELOG
=========
3.2.0
-----
* Deprecated the possibility to inject the Form Twig Renderer into the form
extension. Inject it on TwigRendererEngine instead.
2.7.0
-----

View File

@ -23,17 +23,26 @@ use Symfony\Component\Form\ChoiceList\View\ChoiceView;
*/
class FormExtension extends \Twig_Extension implements \Twig_Extension_InitRuntimeInterface
{
public function __construct(TwigRendererInterface $renderer)
private $renderer;
public function __construct(TwigRendererInterface $renderer = null)
{
if (null !== $this->renderer) {
@trigger_error(sprintf('Passing a Twig Form Renderer to the "%s" constructor is deprecated since version 3.2 and won\'t be possible in 4.0. Pass the Twig_Environment to the TwigRendererEngine constructor instead.', static::class), E_USER_DEPRECATED);
}
$this->renderer = $renderer;
}
/**
* {@inheritdoc}
*
* To be removed in 4.0
*/
public function initRuntime(\Twig_Environment $environment)
{
$this->renderer->setEnvironment($environment);
if (null !== $this->renderer) {
$this->renderer->setEnvironment($environment);
}
}
/**

View File

@ -29,6 +29,16 @@ class TwigRendererEngine extends AbstractRendererEngine implements TwigRendererE
*/
private $template;
public function __construct(array $defaultThemes = array(), \Twig_Environment $environment = null)
{
if (null === $environment) {
@trigger_error(sprintf('Not passing a Twig Environment as the second argument for "%s" constructor is deprecated since version 3.2 and won\'t be possible in 4.0.', static::class), E_USER_DEPRECATED);
}
parent::__construct($defaultThemes);
$this->environment = $environment;
}
/**
* {@inheritdoc}
*/

View File

@ -15,6 +15,8 @@ use Symfony\Component\Form\FormRendererEngineInterface;
/**
* @author Bernhard Schussek <bschussek@gmail.com>
*
* @deprecated Deprecated since version 3.2, to be removed in 4.0.
*/
interface TwigRendererEngineInterface extends FormRendererEngineInterface
{

View File

@ -15,6 +15,8 @@ use Symfony\Component\Form\FormRendererInterface;
/**
* @author Bernhard Schussek <bschussek@gmail.com>
*
* @deprecated Deprecated since version 3.2, to be removed in 4.0.
*/
interface TwigRendererInterface extends FormRendererInterface
{

View File

@ -34,13 +34,6 @@ class FormExtensionBootstrap3HorizontalLayoutTest extends AbstractBootstrap3Hori
{
parent::setUp();
$rendererEngine = new TwigRendererEngine(array(
'bootstrap_3_horizontal_layout.html.twig',
'custom_widgets.html.twig',
));
$this->renderer = new TwigRenderer($rendererEngine, $this->getMock('Symfony\Component\Security\Csrf\CsrfTokenManagerInterface'));
$extension = new FormExtension($this->renderer);
$loader = new StubFilesystemLoader(array(
__DIR__.'/../../Resources/views/Form',
__DIR__.'/Fixtures/templates/form',
@ -48,8 +41,13 @@ class FormExtensionBootstrap3HorizontalLayoutTest extends AbstractBootstrap3Hori
$environment = new \Twig_Environment($loader, array('strict_variables' => true));
$environment->addExtension(new TranslationExtension(new StubTranslator()));
$environment->addExtension($extension);
$extension->initRuntime($environment);
$environment->addExtension(new FormExtension());
$rendererEngine = new TwigRendererEngine(array(
'bootstrap_3_horizontal_layout.html.twig',
'custom_widgets.html.twig',
), $environment);
$this->renderer = new TwigRenderer($rendererEngine, $this->getMock('Symfony\Component\Security\Csrf\CsrfTokenManagerInterface'));
$this->registerTwigRuntimeLoader($environment, $this->renderer);
}

View File

@ -30,13 +30,6 @@ class FormExtensionBootstrap3LayoutTest extends AbstractBootstrap3LayoutTest
{
parent::setUp();
$rendererEngine = new TwigRendererEngine(array(
'bootstrap_3_layout.html.twig',
'custom_widgets.html.twig',
));
$this->renderer = new TwigRenderer($rendererEngine, $this->getMock('Symfony\Component\Security\Csrf\CsrfTokenManagerInterface'));
$extension = new FormExtension($this->renderer);
$loader = new StubFilesystemLoader(array(
__DIR__.'/../../Resources/views/Form',
__DIR__.'/Fixtures/templates/form',
@ -44,8 +37,13 @@ class FormExtensionBootstrap3LayoutTest extends AbstractBootstrap3LayoutTest
$environment = new \Twig_Environment($loader, array('strict_variables' => true));
$environment->addExtension(new TranslationExtension(new StubTranslator()));
$environment->addExtension($extension);
$extension->initRuntime($environment);
$environment->addExtension(new FormExtension());
$rendererEngine = new TwigRendererEngine(array(
'bootstrap_3_layout.html.twig',
'custom_widgets.html.twig',
), $environment);
$this->renderer = new TwigRenderer($rendererEngine, $this->getMock('Symfony\Component\Security\Csrf\CsrfTokenManagerInterface'));
$this->registerTwigRuntimeLoader($environment, $this->renderer);
}

View File

@ -31,13 +31,6 @@ class FormExtensionDivLayoutTest extends AbstractDivLayoutTest
{
parent::setUp();
$rendererEngine = new TwigRendererEngine(array(
'form_div_layout.html.twig',
'custom_widgets.html.twig',
));
$this->renderer = new TwigRenderer($rendererEngine, $this->getMock('Symfony\Component\Security\Csrf\CsrfTokenManagerInterface'));
$extension = new FormExtension($this->renderer);
$loader = new StubFilesystemLoader(array(
__DIR__.'/../../Resources/views/Form',
__DIR__.'/Fixtures/templates/form',
@ -48,8 +41,13 @@ class FormExtensionDivLayoutTest extends AbstractDivLayoutTest
$environment->addGlobal('global', '');
// the value can be any template that exists
$environment->addGlobal('dynamic_template_name', 'child_label');
$environment->addExtension($extension);
$extension->initRuntime($environment);
$environment->addExtension(new FormExtension());
$rendererEngine = new TwigRendererEngine(array(
'form_div_layout.html.twig',
'custom_widgets.html.twig',
), $environment);
$this->renderer = new TwigRenderer($rendererEngine, $this->getMock('Symfony\Component\Security\Csrf\CsrfTokenManagerInterface'));
$this->registerTwigRuntimeLoader($environment, $this->renderer);
}

View File

@ -30,13 +30,6 @@ class FormExtensionTableLayoutTest extends AbstractTableLayoutTest
{
parent::setUp();
$rendererEngine = new TwigRendererEngine(array(
'form_table_layout.html.twig',
'custom_widgets.html.twig',
));
$this->renderer = new TwigRenderer($rendererEngine, $this->getMock('Symfony\Component\Security\Csrf\CsrfTokenManagerInterface'));
$extension = new FormExtension($this->renderer);
$loader = new StubFilesystemLoader(array(
__DIR__.'/../../Resources/views/Form',
__DIR__.'/Fixtures/templates/form',
@ -45,8 +38,13 @@ class FormExtensionTableLayoutTest extends AbstractTableLayoutTest
$environment = new \Twig_Environment($loader, array('strict_variables' => true));
$environment->addExtension(new TranslationExtension(new StubTranslator()));
$environment->addGlobal('global', '');
$environment->addExtension($extension);
$extension->initRuntime($environment);
$environment->addExtension(new FormExtension());
$rendererEngine = new TwigRendererEngine(array(
'form_table_layout.html.twig',
'custom_widgets.html.twig',
), $environment);
$this->renderer = new TwigRenderer($rendererEngine, $this->getMock('Symfony\Component\Security\Csrf\CsrfTokenManagerInterface'));
$this->registerTwigRuntimeLoader($environment, $this->renderer);
}

View File

@ -116,14 +116,13 @@
<argument type="service" id="router.request_context" on-invalid="ignore" />
</service>
<service id="twig.extension.form" class="Symfony\Bridge\Twig\Extension\FormExtension" public="false">
<argument type="service" id="twig.form.renderer" />
</service>
<service id="twig.extension.form" class="Symfony\Bridge\Twig\Extension\FormExtension" public="false" />
<service id="twig.extension.debug" class="Twig_Extension_Debug" public="false" />
<service id="twig.form.engine" class="Symfony\Bridge\Twig\Form\TwigRendererEngine" public="false">
<argument>%twig.form.resources%</argument>
<argument type="service" id="twig" />
</service>
<service id="twig.form.renderer" class="Symfony\Bridge\Twig\Form\TwigRenderer">