Skip to content

Commit 898a63c

Browse files
committed
merged branch maxbeutel/pr/custom-template-escaping (PR #7479)
This PR was merged into the master branch. Discussion ---------- [TwigBundle] Make twig extension handle custom template escaping guesser I wanted to add a custom template escaping guesser for twig like in http://twig.sensiolabs.org/doc/recipes.html#using-the-template-name-to-set-the-default-escaping-strategy This pull request allows you register a service id and a method as a custom guesser: twig: autoescape: my_service:guess Documentation is missing for this PR and the unit tests are not that good. I´d work on it if this PR has any chance of getting merged? | Q | A | ------------- | --- | Bug fix? | no | New feature? | yes | BC breaks? | no | Deprecations? | no | Tests pass? | yes | Fixed tickets | none | License | MIT | Doc PR | (missing) Commits ------- c2c1ed0 make twig extension handle custom template escaping guesser
2 parents d604af1 + c2c1ed0 commit 898a63c

File tree

11 files changed

+92
-3
lines changed

11 files changed

+92
-3
lines changed

src/Symfony/Bundle/TwigBundle/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
CHANGELOG
22
=========
33

4+
2.3.0
5+
-----
6+
7+
* added option to configure a custom template escaping guesser
8+
49
2.2.0
510
-----
611

src/Symfony/Bundle/TwigBundle/DependencyInjection/Configuration.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,8 @@ private function addTwigOptions(ArrayNodeDefinition $rootNode)
119119
->fixXmlConfig('path')
120120
->children()
121121
->scalarNode('autoescape')->end()
122+
->scalarNode('autoescape_service')->defaultNull()->end()
123+
->scalarNode('autoescape_service_method')->defaultNull()->end()
122124
->scalarNode('base_template_class')->example('Twig_Template')->end()
123125
->scalarNode('cache')->defaultValue('%kernel.cache_dir%/twig')->end()
124126
->scalarNode('charset')->defaultValue('%kernel.charset%')->end()

src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,19 +101,26 @@ public function load(array $configs, ContainerBuilder $container)
101101
$config['extensions']
102102
);
103103

104-
$container->setParameter('twig.options', $config);
105-
106104
if ($container->getParameter('kernel.debug')) {
107105
$loader->load('debug.xml');
108106

109107
$container->setDefinition('templating.engine.twig', $container->findDefinition('debug.templating.engine.twig'));
110108
$container->setAlias('debug.templating.engine.twig', 'templating.engine.twig');
111109
}
112110

113-
if (!isset($config['autoescape'])) {
111+
if (isset($config['autoescape_service']) && 0 === strpos($config['autoescape_service'], '@') && isset($config['autoescape_service_method'])) {
112+
$container->findDefinition('templating.engine.twig')->addMethodCall('setDefaultEscapingStrategy', array(array(new Reference(substr($config['autoescape_service'], 1)), $config['autoescape_service_method'])));
113+
114+
unset(
115+
$config['autoescape_service'],
116+
$config['autoescape_service_method']
117+
);
118+
} elseif (!isset($config['autoescape'])) {
114119
$container->findDefinition('templating.engine.twig')->addMethodCall('setDefaultEscapingStrategy', array(array(new Reference('templating.engine.twig'), 'guessDefaultEscapingStrategy')));
115120
}
116121

122+
$container->setParameter('twig.options', $config);
123+
117124
$this->addClassesToCompile(array(
118125
'Twig_Environment',
119126
'Twig_Extension',

src/Symfony/Bundle/TwigBundle/Resources/config/schema/twig-1.0.xsd

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
<xsd:attribute name="auto-reload" type="xsd:string" />
1818
<xsd:attribute name="autoescape" type="xsd:string" />
19+
<xsd:attribute name="autoescape_service" type="xsd:string" />
20+
<xsd:attribute name="autoescape_service_method" type="xsd:string" />
1921
<xsd:attribute name="base-template-class" type="xsd:string" />
2022
<xsd:attribute name="cache" type="xsd:string" />
2123
<xsd:attribute name="charset" type="xsd:string" />
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<?php
2+
3+
$container->loadFromExtension('twig', array(
4+
'autoescape_service' => '@my_project.some_bundle.template_escaping_guesser',
5+
'autoescape_service_method' => 'guess',
6+
));
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<?php
2+
3+
$container->loadFromExtension('twig', array());
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?xml version="1.0" ?>
2+
3+
<container xmlns="http://symfony.com/schema/dic/services"
4+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5+
xmlns:twig="http://symfony.com/schema/dic/twig"
6+
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd
7+
http://symfony.com/schema/dic/twig http://symfony.com/schema/dic/twig/twig-1.0.xsd">
8+
9+
<twig:config autoescape_service="@my_project.some_bundle.template_escaping_guesser" autoescape_service_method="guess" />
10+
</container>
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?xml version="1.0" ?>
2+
3+
<container xmlns="http://symfony.com/schema/dic/services"
4+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5+
xmlns:twig="http://symfony.com/schema/dic/twig"
6+
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd
7+
http://symfony.com/schema/dic/twig http://symfony.com/schema/dic/twig/twig-1.0.xsd">
8+
9+
<twig:config />
10+
</container>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
twig:
2+
autoescape_service: @my_project.some_bundle.template_escaping_guesser
3+
autoescape_service_method: guess
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
twig:

src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/TwigExtensionTest.php

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,32 @@ public function testLoadFullConfiguration($format)
8383
$this->assertTrue($options['strict_variables'], '->load() sets the strict_variables option');
8484
}
8585

86+
/**
87+
* @dataProvider getFormats
88+
*/
89+
public function testLoadCustomTemplateEscapingGuesserConfiguration($format)
90+
{
91+
$container = $this->createContainer();
92+
$container->registerExtension(new TwigExtension());
93+
$this->loadFromFile($container, 'customTemplateEscapingGuesser', $format);
94+
$this->compileContainer($container);
95+
96+
$this->assertTemplateEscapingGuesserDefinition($container, 'my_project.some_bundle.template_escaping_guesser', 'guess');
97+
}
98+
99+
/**
100+
* @dataProvider getFormats
101+
*/
102+
public function testLoadDefaultTemplateEscapingGuesserConfiguration($format)
103+
{
104+
$container = $this->createContainer();
105+
$container->registerExtension(new TwigExtension());
106+
$this->loadFromFile($container, 'empty', $format);
107+
$this->compileContainer($container);
108+
109+
$this->assertTemplateEscapingGuesserDefinition($container, 'templating.engine.twig', 'guessDefaultEscapingStrategy');
110+
}
111+
86112
public function testGlobalsWithDifferentTypesAndValues()
87113
{
88114
$globals = array(
@@ -189,4 +215,18 @@ private function loadFromFile(ContainerBuilder $container, $file, $format)
189215

190216
$loader->load($file.'.'.$format);
191217
}
218+
219+
private function assertTemplateEscapingGuesserDefinition(ContainerBuilder $container, $serviceId, $serviceMethod)
220+
{
221+
$def = $container->getDefinition('templating.engine.twig');
222+
223+
$this->assertCount(1, $def->getMethodCalls());
224+
225+
foreach ($def->getMethodCalls() as $call) {
226+
if ('setDefaultEscapingStrategy' === $call[0]) {
227+
$this->assertSame($serviceId, (string) $call[1][0][0]);
228+
$this->assertSame($serviceMethod, $call[1][0][1]);
229+
}
230+
}
231+
}
192232
}

0 commit comments

Comments
 (0)