Symfony2 - 如何在树枝中访问动态变量名称

Mil*_*loš 13 php symfony twig

我在树枝上有一些变数

placeholder1
placeholder2
placeholderx
Run Code Online (Sandbox Code Playgroud)

为了调用它们,我循环遍历对象数组"发票"

{% for invoices as invoice %}
    need to display here the placeholder followed by the invoice id number
    {{ placeholedr1 }}
Run Code Online (Sandbox Code Playgroud)

任何的想法?谢谢.

小智 25

我只是遇到了同样的问题 - 并且使用了这个第一个答案,经过一些额外的研究后发现{{ attribute(_context, 'placeholder'~invoice.id) }}应该工作(_context作为包含所有对象的全局上下文对象)


mar*_*ias 12

您也可以使用常规括号表示法访问数组的值,而不是使用该attribute函数_context:

{{ _context['placeholder' ~ id] }}
Run Code Online (Sandbox Code Playgroud)

我个人会使用这个,因为它更简洁,在我看来更清楚.

如果环境选项 strict_variables设置为true,您还应该使用default过滤器:

{{ _context['placeholder' ~ id]|default }}

{{ attribute(_context, 'placeholder' ~ id)|default }}
Run Code Online (Sandbox Code Playgroud)

否则,Twig_Error_Runtime如果变量不存在,您将获得异常.举例来说,如果你有变量foo,并bar而是尝试输出变量baz(不存在),你得到的信息是例外Key "baz" for array with keys "foo, bar" does not exist.

检查变量是否存在的更详细的方法是使用defined测试:

{% if _context['placeholder' ~ id] is defined %} ... {% endif %}
Run Code Online (Sandbox Code Playgroud)

使用default过滤器,您还可以提供默认值,例如null字符串:

{{ _context['placeholder' ~ id]|default(null) }}

{{ attribute(_context, 'placeholder' ~ id)|default('Default value') }}
Run Code Online (Sandbox Code Playgroud)

如果省略默认值(即使用|default而不是|default(somevalue)),则默认值为空字符串.

strict_variablesfalse默认,但我更愿意将它设置为true避免因例如错别字意外的问题.


Ein*_*lum 5

我猜你可以使用 Twigattribute函数。

http://twig.sensiolabs.org/doc/functions/attribute.html