48

有没有办法在树枝中更新对象的属性?

像下面这样的对象被传递给 twig:

object
   property1
   property2

我想像这样更新property1:

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

上面的代码不起作用,但是可以在 twig 中做这样的事情吗?如果没有,有没有办法编写扩展或宏来做到这一点?

4

6 回答 6

60

您可以通过合并对象来做到这一点:

{% set object = object|merge({'property1': 'somenewvalue'}) %}
于 2013-10-03T13:16:32.513 回答
8

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

{% do foo.setBar(value) %}
于 2019-08-28T15:33:15.967 回答
4

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

class Get extends StdClass 
  {

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

  }
于 2011-12-30T04:34:12.653 回答
1

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

{%- block nav_label -%}
    {%- set oldLabel = item.label %}
    {%- set navLabel = item.getExtra('nav_label')|default(oldLabel) %}
    {{- item.setLabel(navLabel) ? '' : '' }}
    {{- block('label') -}}
    {{- item.setLabel(oldLabel) ? '' : '' }}
{%- endblock -%}
于 2015-08-24T05:29:54.070 回答
0

如果您的属性是数组 (object->property['key']),您可以执行以下操作:

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

相当于:

this->property['key'][] = 'some value';
于 2017-01-18T22:05:30.327 回答
-4
{{ set(object, 'property', value) }}
于 2016-04-06T14:42:36.463 回答