在树枝中更新对象属性


Updating object properties in twig

是否有一种方法来更新一个对象的属性在树枝?

将如下对象传递给twig:

object
   property1
   property2

我想这样更新property1:

{% set object.property1 = 'somenewvalue' %}

上面的代码不工作,但它是可能做这样的事情在树枝吗?如果没有,是否有办法编写一个扩展或宏来做到这一点?

回答从2013年

可以通过合并对象来实现:

{% set object = object|merge({'property1': 'somenewvalue'}) %}

2023年更新

我不知道从哪个版本的树枝这个解决方案不再工作了。现在您只能创建一个具有新名称的对象:

{% set data = {foo:1} %}
{% set updated = data|merge({ bar: 2 }) %}
foo: {{ updated.foo }} {# Produces “foo: 1” #}
bar: {{ updated.bar }} {# Produces “bar: 2” #}

Twig有一个do标签,可以让你这样做。

{% do foo.setBar(value) %}

设置属性的一种可能方法是在对象中创建一个实际创建新属性的方法:

class Get extends StdClass 
  {
    protected function setProperty($name,$value = null)
    {
    $this->$name = $value;
    }
  }

我在knp菜单模板中遇到了同样的问题。我想用label块渲染一个替代字段,而不复制它。当然,底层对象需要属性的setter。

{%- block nav_label -%}
    {%- set oldLabel = item.label %}
    {%- set navLabel = item.getExtra('nav_label')|default(oldLabel) %}
    {{- item.setLabel(navLabel) ? '' : '' }}
    {{- block('label') -}}
    {{- item.setLabel(oldLabel) ? '' : '' }}
{%- endblock -%}

如果你的属性是array (object->property['key']),你可以这样做:

{% set arr = object.property|merge({"key":['some value']}) %}
{{ set(object, 'property', arr) }}

相当于:

this->property['key'][] = 'some value';
{{ set(object, 'property', value) }}