Twig是否支持...可变参数?如何在include中传递可变数量参数?
解决Twig中通过include传递数组作为可变参数调用函数的问题
Twig本身**确实不支持像PHP那样的展开运算符(...)**来将数组拆分为多个参数传递给函数,这就是你尝试{{ callFunction(func_name, ...arguments) }}时失败的原因。不过有几种简单的方式可以实现你的需求,下面是具体方案:
方案1:修改自定义PHP函数,兼容数组与多参数调用
最直接的办法是调整你定义的callFunction函数,让它既能兼容原来的多参数调用方式,又能接受数组作为参数。比如:
public function callFunction($name, ...$arguments) { // 检查是否传入了单个数组参数(即通过include传递的场景) if (count($arguments) === 1 && is_array($arguments[0])) { $arguments = $arguments[0]; } // 执行你原本的函数调用逻辑,比如调用目标函数 return call_user_func_array($name, $arguments); }
修改后两种调用方式都能正常工作:
- 原有的多参数直接调用:
{{ callFunction('funcName', arg1, arg2, arg3) }} {{ callFunction('funcName2', null, true) }} - 通过include传递数组的调用:
在{% set foo = 'bar' %} {% include 'call_function.twig' with { 'func_name':'funcName2', 'arguments': [ null, true ] } %}call_function.twig中直接写:{{ callFunction(func_name, arguments) }}
方案2:新增专门处理数组参数的Twig函数
如果你不想修改原有函数的逻辑,可以新增一个专门的Twig函数,比如callFunctionWithArgsArray:
public function callFunctionWithArgsArray($name, array $arguments) { return call_user_func_array($name, $arguments); }
注册这个函数后,在call_function.twig里就可以这样调用:
{{ callFunctionWithArgsArray(func_name, arguments) }}
为什么原方式不生效?
Twig的语法设计中没有实现PHP的...展开运算符,它的函数调用要求参数必须逐个明确传递,无法自动将数组拆分为多个独立参数。所以直接在Twig模板里写...arguments会被判定为无效语法。
内容的提问来源于stack exchange,提问作者Kamafeather
相关产品推荐
相关产品推荐

