obj['prop'] 仅当 obj 是数组时才会返回值,如果我们在变量中有它的名称,则无法获取对象属性: obj[propName] 将返回 null
您可以使用点符号来检查数组和对象,因此 obj.name 将首先查找 obj['name'] 然后 obj->name 和最后一个 obj->getName() 这也在文档中进一步解释在设计师的 Twig 章节下。
我认为 artyv 的问题在于动态访问对象属性,而不是简单地访问偏移量/属性。 请参阅我的示例代码。
/* php */
$obj = new stdClass;
$obj->foo = "bar";
$template->render(array('obj, $obj));
/* twig */
{% set prop as "foo" %}
{{ obj.foo }}
// outputs "bar"
{{ obj.$prop }}
// (pseudo-code)
// would compile down to {{ obj.foo }} and output "bar"
jwpage 是对的,我需要获取的属性名称在其他变量中,所以我需要等效于这个 php 代码:
$obj->{$propName}
因为 $obj 是简单的对象,它没有实现 ArrayAccess
此功能不会包含在 Twig 中。 Twig 是一个模板系统,而不是一个功能齐全的语言。 动态属性显然超出了 Twig 的范围。
我猜序列化器组件可用于将嵌套的 stdClass 实例转换为嵌套的数组。
我认为只需将 stdClass 类型转换为数组,它就会被转换。 为什么让它变得比现在更困难:)
[~] php -r '$class = new stdClass;$class->prop = "hejsa";print_r((array) $class);'
Array
(
[prop] => hejsa
)
@henrikbjorn :是的类型转换有效,但是它不能递归地工作,这就是我建议使用序列化程序组件的原因。 显然,如果您知道自己没有深度嵌套的结构,那么显然只需将其转换为数组即可完成。
我遇到了同样的问题,我使用过滤器解决了它。 我知道这不是正确的做事方式,但它看起来确实是最干净的。
基本上它归结为:
function twig_get_filter()
{
$params = func_get_args();
$object = array_shift($params);
$field = implode('', $params);
return $object->$field;
}
您可以按如下方式使用它:
{{ object|get(text, '_', language, '_', type) }}
动态属性显然超出了 Twig 的范围。
为什么? 我正在尝试开发类似 symfony datagrid 的东西,我想使用这样的东西:
{# columns #}
{% for name, column in grid.columns %}
<td>{{ column.render(row[name])|raw }}</td>
{% endfor %}
我找不到比在我的数据网格中实现 Twig_Template::getAttribute 方法更好的解决方案了。 我喜欢它的普遍性。
因为它是一种边缘情况,并且因为您可以轻松创建一个可以非常轻松地完成您想要的功能(未经测试)的函数:
function twig_array_get_function($array, $name)
{
return $array[$name];
}
用法:
row|array_get(name)
是的,对于数组,这很容易。 问题是我还必须实现访问已经在 Twig 中实现的对象等的 getter(但没有办法如何使用此代码)。
好消息! 从 1.2 开始,您现在可以通过新的attribute
函数获取变量的动态属性(请参阅 c609060)。
很高兴看到为此添加了支持。 我刚刚开始使用 Twig。 将语法更改为类似的东西会有多困难
{{ object.{property} }} 或 {{ object.{method}(attrs) }}
我认为它比 {{ 属性(对象,方法,参数)}} 更简洁
也许你能指出我正确的方向? 我还没有完成所有的源代码。
@rspenc29 :我不想让它“更干净”,因为我希望您在模板中使用它之前三思而后行。 这是要谨慎使用,因为在大多数情况下,这是一种气味,您在模板中做一些应该在其他地方完成的事情。
没问题。 我会弄清楚。
asd 专用
你可以试试{{ attribute(object, method) }}
{{attribute(obj, foo)}}
http://twig.sensiolabs.org/doc/2.x/functions/attribute.html
最有用的评论
你可以试试
{{ attribute(object, method) }}
{{attribute(obj, foo)}}
http://twig.sensiolabs.org/doc/2.x/functions/attribute.html