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