如何在树枝中禁用或覆盖内置函数

时间:2017-06-17 16:27:21

标签: symfony twig

可以禁用内置功能,例如

  • 属性
  • 常数
  • 周期
  • 日期
  • 转储
  • 包括
  • 最大
  • 分钟
  • 随机
  • 范围
  • template_from_string

这是我的代码:

 $tags = ['if', 'for', 'set'];
 $filters = ['upper', 'escape', 'raw', 'join', 'length', 'escape'];
 $functions = ['range'];

 $policy = new \Twig_Sandbox_SecurityPolicy($tags, $filters, [], [], $functions);

我想知道为什么在政策允许范围

时仍然可以使用parent()

1 个答案:

答案 0 :(得分:1)

parent()不是函数,这是一种语言结构(就像php中的isset()一样)。

请考虑以下代码:

main.twig

{% extends 'parent.twig' %}

{% block body %}
    {{ max(1, 2, 3) }}
    {{ parent() }}
{% endblock %}

parent.twig

{% block body %}
{% endblock %}

如果查看已编译的模板,将按以下方式编译正文块:

    // line 3
    public function block_body($context, array $blocks = array())
    {
        // line 4
        echo "
    ";
        // line 5
        echo twig_escape_filter($this->env, max(1, 2, 3), "html", null, true);
        echo "

    ";
        // line 7
        $this->displayParentBlock("body", $context, $blocks);
        echo "

";
    }

如果您想查看full compiled template

正如您所看到的,Twig并没有使用标准助手来调用此函数,因此,parent()不会通过沙盒过滤系统。

如果您想要另一个证明parent()是语言构造的证据,只需在block()不在Twig_Error_Syntax时调用即可。您将获得Twig_Error_Runtime个例外,而不是parent()例外。 Try it yourself in this fiddle

因此,要回答您的问题,禁用{% block %}的唯一方法是禁用parent()标记。因此,使用%}会抛出语法错误,就像忘记了{{1}}一样。