php - 如何使用 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] - 那里也没有运气。
有任何想法吗?
解决方案
如果您使用的是 Twig >= 2.10,则可以使用reduce()
过滤器:
{{ field.name|split('.')|reduce((carry, v) => carry ? attribute(carry, v) : null, data) }}
推荐阅读
- javascript - 在引导程序中提交 btn 单击后如何使用 nav-item 导航?
- c++ - 为什么我不能使用 Qt 以正常方式连接到数据库?
- javascript - 在多个 Nightwatchjs 测试步骤中重用定义的变量
- entity-framework - LINQ Where 子句常量表达式优化
- android - 为什么 IOS 和 Android 之间的标头行为存在差异 - Expo Application/React Navigation
- excel - 替换多行文本框中的字符串
- go - 如何从 Go 源代码生成 OpenAPI v3 规范?
- php - PHP Laravel 控制器功能 - 如何在从外部提要导入内容时添加额外条件
- google-drive-api - 向 Google 共享云端硬盘的成员添加服务帐号
- python - Python Selenium 清除 Chrome 饼干