可以禁用内置功能,例如
这是我的代码:
$tags = ['if', 'for', 'set'];
$filters = ['upper', 'escape', 'raw', 'join', 'length', 'escape'];
$functions = ['range'];
$policy = new \Twig_Sandbox_SecurityPolicy($tags, $filters, [], [], $functions);
我想知道为什么在政策允许范围
时仍然可以使用parent()答案 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}}一样。