如何向assets函数内部的Twig宏传递动态变量?
Twig宏向asset函数传动态变量的实现方案
完全可以向Twig宏内的asset函数传递动态变量,原有代码无法运行是存在三处语法/逻辑错误:
- 错误1:Twig的输出分隔符
{{ }}不支持嵌套使用。你在{{ asset(...) }}的表达式内部,给变量image额外套了一层{{ }},会直接触发Twig解析错误。 - 错误2:宏调用语法未闭合。你写的调用代码
{{ macros.card('questions.svg'}}末尾缺少匹配的右圆括号,属于基础语法错误。 - 错误3:文件后缀重复拼接。你调用宏时传入的参数已经带了
.svg后缀,宏内部拼接路径时又追加了一次.svg,最终生成的资源路径会变成assets/images/questions.svg.svg,导致资源加载404。
正确写法
你可以根据自己的传参习惯二选一:
方案1:宏内部统一拼接.svg后缀
适合所有卡片svg资源都在同一路径、后缀统一的场景,调用时只需要传文件名主体:
{# 宏定义 #} {% macro card(image) %} <div class="card"> <img src="{{ asset('assets/images/' ~ image ~ '.svg') }}" alt="" /> </div> {% endmacro %} {# 宏调用 #} {{ macros.card('questions') }}
方案2:调用时传入完整文件名
适合需要灵活传入不同后缀、不同子路径资源的场景:
{# 宏定义 #} {% macro card(image) %} <div class="card"> <img src="{{ asset('assets/images/' ~ image) }}" alt="" /> </div> {% endmacro %} {# 宏调用 #} {{ macros.card('questions.svg') }}
核心规则:Twig中
~是原生字符串拼接运算符,在{{ }}包裹的Twig表达式环境里,变量可以直接引用,不需要额外套{{ }}分隔符。
内容的提问来源于stack exchange,提问作者Lukas Hillebrand
相关产品推荐
相关产品推荐

