Как правильно включить расширение песочницы twig в Symfony2?

В 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 , я увидел способ сделать это изначально (без 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); 

Я могу сделать что-то подобное внутри службы непосредственно перед тем, как использовать песочницу, но это не так ясно, как вливание зависимости, к которому мы привыкли.

Есть ли лучший / правильный способ включить расширение песочницы twig в Symfony2?

Почему бы не создать частный сервис политики безопасности:

 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 гарантирует, что она не будет доступна с помощью контейнера (ее все равно можно добавить в другие службы, но я думаю, что это не проблема).

Отказ от ответственности: я не тестировал это, и ему, вероятно, нужна некоторая настройка, прежде чем он действительно работает, поэтому не копируйте пасту!