在Symfony2中,默认情况下会禁用一些Twig模块。其中一个是调试扩展,它添加了{% debug %}
标记(在开发环境中很有用)。
要启用它,没有什么困难,您可以将此服务添加到您的配置中:
debug.twig.extension:
class: Twig_Extensions_Extension_Debug
tags:
- { name: 'twig.extension' }
但是如何启用{% sandbox %}
代码?
我的问题是扩展程序的构造函数采用安全策略:
public function __construct(Twig_Sandbox_SecurityPolicyInterface $policy, $sandboxed = false)
{
$this->policy = $policy;
$this->sandboxedGlobally = $sandboxed;
}
通过阅读twig documentation,我看到了本地化的方法(没有Symfony2):
$tags = array('if');
$filters = array('upper');
$methods = array(
'Article' => array('getTitle', 'getBody'),
);
$properties = array(
'Article' => array('title', 'body'),
);
$functions = array('range');
$policy = new Twig_Sandbox_SecurityPolicy($tags, $filters, $methods, $properties, $functions);
$sandbox = new Twig_Extension_Sandbox($policy);
$twig->addExtension($sandbox);
我可以在使用沙盒之前在服务中做类似的事情,但这并不像我们习惯的依赖注入那么清晰。
是否有更好/正确的方法在Symfony2中启用twig的沙箱扩展?
答案 0 :(得分:6)
为什么不创建安全策略的私有服务:
parameters:
twig.sandbox.tags:
- if
twig.sandbox.filters:
- upper
twig.sandbox.methods:
Article: [getTitle, getBody]
twig.sandbox.properties:
Article: [title, body]
twig.sandbox.functions:
- range
twig.sandbox.policy:
class: Twig_Sandbox_SecurityPolicy
arguments:
- %twig.sandbox.tags%
- %twig.sandbox.filters%
- %twig.sandbox.methods%
- %twig.sandbox.properties%
- %twig.sandbox.functions%
public: false
然后,您可以将此服务注入twig.sandbox.extension
服务:
twig.sandbox.extension:
class: Twig_Extension_Sandbox
arguments:
- @twig.sandbox.policy
tags:
- { name: twig.extension }
完成。标记twig.sandbox.policy
私有确保它无法使用容器访问(它仍然可以注入其他服务,但我认为这不是问题)。
免责声明:我还没有对此进行测试,可能需要进行一些调整才能实际运行,所以不要复制粘贴!