自升级到Twig 2.0后,我收到错误消息Accessing Twig_Template attributes is forbidden
。引用的行包含{{ include }}
或宏调用。
在Twig 2.0中,{{ import }}
'ed宏不再继承到子模板,请参阅https://github.com/twigphp/Twig/issues/2336
解决方案:您需要在每个.twig文件中导入所需的宏。
如果错误显示在包含{{ include }}
或{{ extends }}
的行上,则必须查看正在包含/扩展的模板,并在那里导入宏。
如果你有很多使用宏的Twig文件,那么通过a Twig Extension定义全局Twig函数可能更容易,也更不容易出错。这样您就不需要在每个文件中导入宏(这可能会在将来的Twig版本中修复)。
例如,当我有
{% macro error(message, dismissible=true) %}
{# Error display code #}
{% endmacro %}
我现在在一个名为UtilitiesExtension
the的Twig Extension中定义了以下函数:
public function getFunctions()
{
return array(
// ...
new \Twig_SimpleFunction('error', array($this, 'error')),
);
}
public function error($message, $dismissible = true) {
return $this->twig->render('patterns/utils/error.html.twig', [
'text' => $message,
'limit' => $dismissible,
]);
}
然后,您需要使用函数名称替换宏调用;请注意,您不能在函数名称中使用点。
这个解决方案很简洁,因为Twig宏应该等同于PHP函数。当然,这应该适应您的需要。