2017-06-17 61 views
2

是有可能禁用内置函数如如何禁用或树枝覆盖内置函数

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

这里是我的代码:

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

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

我很迷惘g为什么父母()仍然可以在政策允许范围内使用

回答

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之一。 Try it yourself in this fiddle

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