diff --git a/src/Symfony/Bundle/TwigBundle/CHANGELOG.md b/src/Symfony/Bundle/TwigBundle/CHANGELOG.md
index 8c03bdbbf1..6e263b90db 100644
--- a/src/Symfony/Bundle/TwigBundle/CHANGELOG.md
+++ b/src/Symfony/Bundle/TwigBundle/CHANGELOG.md
@@ -1,6 +1,11 @@
CHANGELOG
=========
+2.3.0
+-----
+
+ * added option to configure a custom template escaping guesser
+
2.2.0
-----
diff --git a/src/Symfony/Bundle/TwigBundle/DependencyInjection/Configuration.php b/src/Symfony/Bundle/TwigBundle/DependencyInjection/Configuration.php
index 5fd2002bed..083eb0ce35 100644
--- a/src/Symfony/Bundle/TwigBundle/DependencyInjection/Configuration.php
+++ b/src/Symfony/Bundle/TwigBundle/DependencyInjection/Configuration.php
@@ -119,6 +119,8 @@ class Configuration implements ConfigurationInterface
->fixXmlConfig('path')
->children()
->scalarNode('autoescape')->end()
+ ->scalarNode('autoescape_service')->defaultNull()->end()
+ ->scalarNode('autoescape_service_method')->defaultNull()->end()
->scalarNode('base_template_class')->example('Twig_Template')->end()
->scalarNode('cache')->defaultValue('%kernel.cache_dir%/twig')->end()
->scalarNode('charset')->defaultValue('%kernel.charset%')->end()
diff --git a/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php b/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php
index 475b18e522..63de4963cf 100644
--- a/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php
+++ b/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php
@@ -101,8 +101,6 @@ class TwigExtension extends Extension
$config['extensions']
);
- $container->setParameter('twig.options', $config);
-
if ($container->getParameter('kernel.debug')) {
$loader->load('debug.xml');
@@ -110,10 +108,19 @@ class TwigExtension extends Extension
$container->setAlias('debug.templating.engine.twig', 'templating.engine.twig');
}
- if (!isset($config['autoescape'])) {
+ if (isset($config['autoescape_service']) && 0 === strpos($config['autoescape_service'], '@') && isset($config['autoescape_service_method'])) {
+ $container->findDefinition('templating.engine.twig')->addMethodCall('setDefaultEscapingStrategy', array(array(new Reference(substr($config['autoescape_service'], 1)), $config['autoescape_service_method'])));
+
+ unset(
+ $config['autoescape_service'],
+ $config['autoescape_service_method']
+ );
+ } elseif (!isset($config['autoescape'])) {
$container->findDefinition('templating.engine.twig')->addMethodCall('setDefaultEscapingStrategy', array(array(new Reference('templating.engine.twig'), 'guessDefaultEscapingStrategy')));
}
+ $container->setParameter('twig.options', $config);
+
$this->addClassesToCompile(array(
'Twig_Environment',
'Twig_Extension',
diff --git a/src/Symfony/Bundle/TwigBundle/Resources/config/schema/twig-1.0.xsd b/src/Symfony/Bundle/TwigBundle/Resources/config/schema/twig-1.0.xsd
index 3706f1480f..9c3b6431d7 100644
--- a/src/Symfony/Bundle/TwigBundle/Resources/config/schema/twig-1.0.xsd
+++ b/src/Symfony/Bundle/TwigBundle/Resources/config/schema/twig-1.0.xsd
@@ -16,6 +16,8 @@
+
+
diff --git a/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/php/customTemplateEscapingGuesser.php b/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/php/customTemplateEscapingGuesser.php
new file mode 100644
index 0000000000..9340b0ff2a
--- /dev/null
+++ b/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/php/customTemplateEscapingGuesser.php
@@ -0,0 +1,6 @@
+loadFromExtension('twig', array(
+ 'autoescape_service' => '@my_project.some_bundle.template_escaping_guesser',
+ 'autoescape_service_method' => 'guess',
+));
diff --git a/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/php/empty.php b/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/php/empty.php
new file mode 100644
index 0000000000..efd2df5f47
--- /dev/null
+++ b/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/php/empty.php
@@ -0,0 +1,3 @@
+loadFromExtension('twig', array());
diff --git a/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/xml/customTemplateEscapingGuesser.xml b/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/xml/customTemplateEscapingGuesser.xml
new file mode 100644
index 0000000000..360e65f48c
--- /dev/null
+++ b/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/xml/customTemplateEscapingGuesser.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
diff --git a/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/xml/empty.xml b/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/xml/empty.xml
new file mode 100644
index 0000000000..771e382e47
--- /dev/null
+++ b/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/xml/empty.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
diff --git a/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/yml/customTemplateEscapingGuesser.yml b/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/yml/customTemplateEscapingGuesser.yml
new file mode 100644
index 0000000000..0c284a5142
--- /dev/null
+++ b/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/yml/customTemplateEscapingGuesser.yml
@@ -0,0 +1,3 @@
+twig:
+ autoescape_service: @my_project.some_bundle.template_escaping_guesser
+ autoescape_service_method: guess
diff --git a/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/yml/empty.yml b/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/yml/empty.yml
new file mode 100644
index 0000000000..a472b2698e
--- /dev/null
+++ b/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/yml/empty.yml
@@ -0,0 +1 @@
+twig:
diff --git a/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/TwigExtensionTest.php b/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/TwigExtensionTest.php
index e778a16212..b872287735 100644
--- a/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/TwigExtensionTest.php
+++ b/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/TwigExtensionTest.php
@@ -83,6 +83,32 @@ class TwigExtensionTest extends TestCase
$this->assertTrue($options['strict_variables'], '->load() sets the strict_variables option');
}
+ /**
+ * @dataProvider getFormats
+ */
+ public function testLoadCustomTemplateEscapingGuesserConfiguration($format)
+ {
+ $container = $this->createContainer();
+ $container->registerExtension(new TwigExtension());
+ $this->loadFromFile($container, 'customTemplateEscapingGuesser', $format);
+ $this->compileContainer($container);
+
+ $this->assertTemplateEscapingGuesserDefinition($container, 'my_project.some_bundle.template_escaping_guesser', 'guess');
+ }
+
+ /**
+ * @dataProvider getFormats
+ */
+ public function testLoadDefaultTemplateEscapingGuesserConfiguration($format)
+ {
+ $container = $this->createContainer();
+ $container->registerExtension(new TwigExtension());
+ $this->loadFromFile($container, 'empty', $format);
+ $this->compileContainer($container);
+
+ $this->assertTemplateEscapingGuesserDefinition($container, 'templating.engine.twig', 'guessDefaultEscapingStrategy');
+ }
+
public function testGlobalsWithDifferentTypesAndValues()
{
$globals = array(
@@ -189,4 +215,18 @@ class TwigExtensionTest extends TestCase
$loader->load($file.'.'.$format);
}
+
+ private function assertTemplateEscapingGuesserDefinition(ContainerBuilder $container, $serviceId, $serviceMethod)
+ {
+ $def = $container->getDefinition('templating.engine.twig');
+
+ $this->assertCount(1, $def->getMethodCalls());
+
+ foreach ($def->getMethodCalls() as $call) {
+ if ('setDefaultEscapingStrategy' === $call[0]) {
+ $this->assertSame($serviceId, (string) $call[1][0][0]);
+ $this->assertSame($serviceMethod, $call[1][0][1]);
+ }
+ }
+ }
}