自升级到Twig 2.0后,我收到错误消息Accessing Twig_Template attributes is forbidden
。引用的行包含{{ include }}
或宏调用。
答案 0 :(得分:24)
在Twig 2.0中{{ import }}
' ed宏不再继承到子模板,请参阅https://github.com/twigphp/Twig/issues/2336
解决方案:您需要在每个.twig文件中导入所需的宏。
如果错误显示在包含{{ include }}
或{{ extends }}
的行上,您必须查看正在包含/扩展的模板,并在那里导入宏。
答案 1 :(得分:1)
如果您使用宏有很多Twig文件,那么定义全局Twig函数到a Twig Extension可能更容易且更不容易出错。这样您就不需要在每个文件中导入宏(这可能会在将来的Twig版本中修复)。
例如,当我有
时{% macro error(message, dismissible=true) %}
{# Error display code #}
{% endmacro %}
我现在在名为UtilitiesExtension
的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函数。当然,这应该适应您的需求。