如何创建返回对象/数组而非字符串的Twig宏?
让Twig宏返回对象/数组而非字符串的方法
嘿,你遇到的问题其实是Twig宏的默认行为导致的——默认情况下宏会输出模板里的内容,而不是返回变量。要让它返回对象或数组,只需要用{% return %}标签明确返回你想要的变量就行,我给你改改代码:
修正后的宏与调用示例
首先是调整后的宏代码:
{% macro createObject(input) %} {% set output = { 'test': 'Hello world' } %} {% set output = output|merge({'disabledLogo': true}) %} {# 用return语句返回我们组装好的对象,而不是让宏输出内容 #} {% return output %} {% endmacro %}
然后在模板里调用的时候,就像你原本写的那样,直接把宏的返回值赋值给变量,还能轻松传给JavaScript:
{% set obj = macros.createObject(input) %} <h2>{{ obj.test }}</h2> {# 传给JavaScript的话,转成JSON即可 #} <script> const appData = {{ obj|json_encode|raw }}; console.log(appData.test); // 会输出 "Hello world" console.log(appData.disabledLogo); // 输出 true </script>
几个关键点要注意
- 如果你不写
{% return %},Twig宏执行完会返回空字符串(因为你的宏里没有任何输出内容),这就是为什么你之前拿不到想要的对象。 {% return %}可以返回任何Twig支持的类型:数组、对象、字符串、数字都没问题,完全能满足你统一格式给JS调用的需求。- 传给JS的时候,一定要用
|json_encode把对象转成JSON字符串,再加|raw避免Twig转义HTML实体,这样JS才能直接解析成可用的对象。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

