Silex 2.x升级后Twig递归宏调用失效问题求助
解决Silex 2.x中Twig递归宏
__self弃用的问题 嘿,这个坑我之前踩过!Silex升级到2.x后,对应的Twig版本(一般是2.x系列)确实弃用了宏内部使用__self进行递归调用的方式,你尝试的import _self as macros方向完全正确,只是可能需要调整细节让它正常工作。
正确的递归宏写法
你需要先在模板顶部把当前模板自身导入为一个别名(比如macros),然后在宏内部用这个别名来调用递归:
{# 先导入当前模板为macros别名 #} {% import _self as macros %} {% macro render_map(data) %} {# 这里写你的业务逻辑,比如处理data的代码 #} <div class="map-item">{{ data.label }}</div> {# 递归调用自身,注意用macros别名 #} {% if data.children is not empty %} <div class="map-children"> {{ macros.render_map(data.children) }} </div> {% endif %} {% endmacro %}
为什么__self不能用了?
在旧版Twig(Silex 1.x对应的版本)中,__self在宏内部指向的是当前模板上下文,所以可以用来递归调用宏。但Twig 2.x之后,__self在宏内部指向的是宏自身的对象,而非模板上下文,所以直接用__self.render_map()会找不到正确的方法,导致报错。
额外注意事项
- 如果你的宏是放在单独的宏文件(比如
macros.twig)里,在使用这个宏的模板中,需要先导入该文件:{% import 'macros.twig' as macros %} {{ macros.render_map(your_data) }} - 确保递归调用时传递的参数正确(比如你代码里的
argument应该是实际需要处理的子数据,比如data.children),参数错误也会导致宏看起来“不工作”。
内容的提问来源于stack exchange,提问作者Akif Now
相关产品推荐
相关产品推荐

