php 更新细枝中的对象特性

mrphzbgm  于 2023-03-11  发布在  PHP
关注(0)|答案(6)|浏览(111)

有没有办法在twig中更新对象的属性?
将如下所示的对象传递给twig:

object
   property1
   property2

我想这样更新property1:

{% set object.property1 = 'somenewvalue' %}
  • 上面的代码不起作用 *,但是有可能在twig中做这样的事情吗?如果没有,有没有办法写一个扩展或宏来做这件事?
waxmsbnn

waxmsbnn1#

2013年的答复

您可以通过合并对象来完成此操作:

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

2023年更新

我不知道从哪个版本的twig开始这个解决方案就不起作用了,现在你只能用一个新的名字来创建一个对象:

{% set data = {foo:1} %}
{% set updated = data|merge({ bar: 2 }) %}

foo: {{ updated.foo }} {# Produces “foo: 1” #}
bar: {{ updated.bar }} {# Produces “bar: 2” #}
osh3o9ms

osh3o9ms2#

Twig有一个do标记,允许您这样做。

{% do foo.setBar(value) %}
lyfkaqu1

lyfkaqu13#

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

class Get extends StdClass 
  {

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

  }
jqjz2hbq

jqjz2hbq4#

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

gev0vcfq5#

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

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

这相当于:

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

piztneat6#

{{ set(object, 'property', value) }}

相关问题