Symfony 如何禁用或覆盖twig中的内置函数

Symfony 如何禁用或覆盖twig中的内置函数,symfony,twig,Symfony,Twig,是否可以禁用内置功能,例如 属性 挡块 不变的 循环 日期 倾倒 包括 马克斯 闵 母公司 随机的 射程 来源 模板\u来自\u字符串 这是我的密码: $tags = ['if', 'for', 'set']; $filters = ['upper', 'escape', 'raw', 'join', 'length', 'escape']; $functions = ['range']; $policy = new \Twig_Sandbox_SecurityPolicy($ta

是否可以禁用内置功能,例如

  • 属性
  • 挡块
  • 不变的
  • 循环
  • 日期
  • 倾倒
  • 包括
  • 马克斯
  • 母公司
  • 随机的
  • 射程
  • 来源
  • 模板\u来自\u字符串
这是我的密码:

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

 $policy = new \Twig_Sandbox_SecurityPolicy($tags, $filters, [], [], $functions);
我想知道为什么在策略只允许范围的情况下仍然可以使用parent()

parent()
不是一个函数,这是一个语言构造(就像php中的
isset()

考虑以下代码:

主枝

母枝

如果查看已编译的模板,主体块将按如下方式编译:

    // 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 "

";
    }
如果你想看电影的话

正如您所见,Twig不会使用标准帮助程序调用此函数,因此,
parent()
不会通过沙箱过滤系统

如果您想要另一个证明
parent()
是一个语言构造的证据,只需在不在
block()中时调用它即可。您将得到一个
Twig\u Error\u语法
异常,而不是
Twig\u Error\u运行时
异常

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

{% 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 "

";
    }