【问题标题】:Updating object properties in twig更新树枝中的对象属性
【发布时间】:2011-12-04 21:53:02
【问题描述】:

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

类似以下的对象被传递给 twig:

object
   property1
   property2

我想像这样更新 property1:

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

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

【问题讨论】:

  • 请忽略我下面的答案,它已经过时了,不应再被接受。不幸的是,我无法删除它,因为它是公认的答案。
  • @rdjs 感谢您告诉我!我已经交换了接受的答案!
  • 接受的答案仅适用于数组和散列,不适用于对象。
  • 我为此创建了一个问题:github.com/twigphp/Twig/issues/2768
  • 根据 symfony 工作人员试图这样做是“树枝中的业务逻辑”,应该避免。见github.com/twigphp/Twig/issues/2768#issuecomment-442368654

标签: php twig


【解决方案1】:

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

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

【讨论】:

  • +1 很棒的本地方式来做到这一点。非常适合单一使用场景。
  • 那么,为什么这是公认的答案?这仅适用于某些 Twig 版本吗?
  • 它不应该是公认的答案,因为它没有回答“如何从对象更新属性”的问题。
  • 这确实不应该是公认的答案 - 根据 Twig 错误输出:合并过滤器仅适用于数组或“Traversable”,将“object”作为第一个参数。 @Baishu 下面的回答适用于我的 Object 用例
【解决方案2】:

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

{% do foo.setBar(value) %}

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 我不得不把这个方法设为public,但这确实是一个不错的解决方案
    • 什么?你到底是怎么称呼 Twig 的?
    • @BrunoSantos object.setProperty("propertyName", 3) 这会将propertyName 设置/创建为3
    • 在树枝上:{% do object.setProperty("propertyName", 3) %}
    【解决方案4】:

    我在我的 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 -%}
    

    【讨论】:

    【解决方案5】:

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

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

    相当于:

    this->property['key'][] = 'some value';
    

    【讨论】:

    • 你节省了我的时间:)
    • 再一次,只有 yii2
    【解决方案6】:
    {{ set(object, 'property', value) }}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-08
      • 2022-01-01
      • 2013-01-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多