Как правильно включить расширение песочницы ветки в 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);

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

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


person Alain Tiemblo    schedule 17.04.2013    source источник


Ответы (1)


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

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

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

person Ramon Kleiss    schedule 17.04.2013
comment
Привет, не могли бы вы предоставить немного больше подробностей об этом ответе? Куда пишем конфиги twig.sandbox.policy и twig.sandbox.extension? Спасибо! - person Acyra; 14.06.2013
comment
Это должно быть сделано (в случае примера) в вашей конфигурации services.yml. - person Ramon Kleiss; 14.06.2013