首页 > 解决方案 > 如何使用 Twig 的属性函数访问嵌套对象属性

问题描述

我正在尝试使用 twig 变量来访问另一个 twig 变量的属性,该变量在我找到“属性”函数之前不起作用。效果很好,除非我需要访问嵌套属性。当包含属性的变量实际上是对象+属性时,它不起作用。例如:

{{ attribute(object1, variable) }}其中变量 = 名称,工作得很好。 {{ attribute(object1, variable) }}其中变量 = object2.name,不起作用。但是,硬编码测试{{ object1.object2.name }}确实有效。

这就是我到达这一点的方法......我有一个 yaml 配置文件,它被控制器解析并将其传递给名为“config”的数组中的 twig。它包含用于定义树枝模板显示的内容的参数。

fields:
  - name: company.name
    label: 'ODM'
    indexView: true
    recodrdView: true
  - name: location
    label: 'Location'
    indexView: true
    recordView: true

此外,一组对象(实体)被传递给模板进行渲染。

上面的“fields.name”是实体属性的名称。我遍历实体数组,然后遍历 config.fields 数组以确定要显示的内容。这是树枝代码:

{% for data in datum %}
    <tr>
    {% for field in config.fields %}
        {% if field.indexView %}
            <td>{{ attribute(data, field.name }}</td>       
        {% endif %}
    {% endfor %}
    </tr>
{% endfor %}

我得到错误:

Neither the property "company.name" nor one of the methods "company.name()", "getcompany.name()"/"iscompany.name()"/"hascompany.name()" or "__call()" exist and have public access in class "App\Entity\Odm".

我想我可以用“。”来分割 field.name 字符串。定界符,然后对属性进行必要数量的调用,但我真的希望有一个更有说服力的解决方案。我也试过 _context['data.' ~ field.name] - 那里也没有运气。

有任何想法吗?

标签: phpsymfonytwig

解决方案


如果您使用的是 Twig >= 2.10,则可以使用reduce()过滤器:

{{ field.name|split('.')|reduce((carry, v) => carry ? attribute(carry, v) : null, data) }}

推荐阅读