使用twig变量动态调用导入的宏子函数

Cha*_*ase 10 twig

我正在尝试使用变量来调用特定的宏名称.

我有一个正在导入的宏文件

{% import 'form-elements.html.twig' as forms %}
Run Code Online (Sandbox Code Playgroud)

现在在该文件中有所有表单元素宏:text,textarea,select,radio等.

我有一个传入的数组变量,其中包含一个元素:

$elements = array(
    array(
        'type'=>'text,
        'value'=>'some value',
        'atts'=>null,
    ),
    array(
        'type'=>'text,
        'value'=>'some other value',
        'atts'=>null,
    ),
);

{{ elements }}
Run Code Online (Sandbox Code Playgroud)

我想要做的是从宏中生成这些元素.当按名称调用时,它们工作得很好:

{{ forms.text(element.0.name,element.0.value,element.0.atts) }}
Run Code Online (Sandbox Code Playgroud)

但是我想做的是这样的:

{% for element in elements %}
{{ forms[element.type](element.name,element.value,element.atts) }}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

我尝试了以下所有导致相同的错误:

{{ forms["'"..element.type.."'"](element.name,element.value,element.atts) }}
{{ forms.(element.type)(element.name,element.value,element.atts) }}
{{ forms.{element.type}(element.name,element.value,element.atts) }}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这会引发以下错误:

 Fatal error: Uncaught exception 'LogicException' with message 'Attribute "value" does not exist for Node "Twig_Node_Expression_GetAttr".' in Twig\Environment.php on line 541
Run Code Online (Sandbox Code Playgroud)

有关解决方案或更好的架构的任何帮助或建议都将非常有用.

Cha*_*ase 15

我只是认为其他人可能想要这个答案,因为fabpot提供:

这确实是不受支持的:调用具有动态名称的宏(我添加了一个适当的例外以更清楚地了解该问题).

如果您真的想这样做,可以使用以下代码执行此操作:

{{attribute(forms,element.type,[element.name,element.value,element.atts])}}

-fabpot

https://github.com/twigphp/Twig/issues/922#issuecomment-11133299