2017-06-17 60 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()將會引發語法錯誤,就像被遺忘的%}一樣。