Twig: 动态访问对象属性

创建于 2010-04-05  ·  17评论  ·  资料来源: twigphp/Twig

obj['prop'] 仅当 obj 是数组时才会返回值,如果我们在变量中有它的名称,则无法获取对象属性: obj[propName] 将返回 null

最有用的评论

你可以试试
{{ attribute(object, method) }}
{{attribute(obj, foo)}}
http://twig.sensiolabs.org/doc/2.x/functions/attribute.html

所有17条评论

您可以使用点符号来检查数组和对象,因此 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

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

maidmaid picture maidmaid  ·  5评论

dvladimirov77 picture dvladimirov77  ·  5评论

mpdude picture mpdude  ·  3评论

SDPrio picture SDPrio  ·  3评论

rungta picture rungta  ·  3评论