【问题标题】:Adding a property to an object in twig将属性添加到树枝中的对象
【发布时间】:2016-08-16 07:30:03
【问题描述】:

我想在 twig 中为这个对象添加属性 2

object
    property1

根据这个问题Updating object properties in twig接受的答案说可以通过合并来实现,但是合并过滤器对对象不起作用,有什么方法可以实现吗?

【问题讨论】:

  • 写自定义的twig函数怎么样?

标签: php twig


【解决方案1】:

我认为最优雅的方式是使用 setter 和 getter:

class TestStdClass
{
    private $prop1;

    public function getProp1()
    {
        return $this->prop1;
    }

    public function setProp1($prop1)
    {
        $this->prop1 = $prop1;
    }
}

然后在 Twig 模板中使用标签 do 来评估表达式(objTestStdClass 的一个实例):

{{ dump(obj) }} {# will print an empty object #}
{% do obj.setProp1('Hello') %}
{{ dump(obj) }}

这将打印:

TestStdClass {#2468 ▼
  -prop1: "Hello"
}

【讨论】:

  • 这样你需要在每个类中为每个属性添加getter和setter。当然,如果我们编写这样的代码会更清楚,但这并不是将新属性附加到对象的通用方法。我的解决方案可以在没有 getter 和 setter 的情况下动态添加属性。
【解决方案2】:

不知道在 twig 中执行此操作的标准方法,但我认为您可以这样做:

1.创建自定义枝条扩展

class TwigPropertySetter extends \Twig_Extension {

    function getName() {
        return 'property_setter';
    }

    function getFunctions() {
        return [
            'setObjectProperty' => new \Twig_Function_Method($this, 'setObjectProperty')
        ];
    }

    function setObjectProperty($object, $propertyName, $propertyValue) {
        $object->{$propertyName} = $propertyValue;
        return $object;            
    }    
}

2。为你的树枝渲染器添加扩展

$twig = new Twig_Environment(null, $options);
$twig->addExtension(new TwigPropertySetter());

3.在你的树枝模板中使用函数

....
{% set object = setObjectProperty(object, 'property2', 'value2') %}
Show new object porperty {{ object.property2 }}
....

注意:未测试

【讨论】:

  • getName是从Twig_Extension扩展时的必需函数
【解决方案3】:

您还可以在您的类中添加一个通用设置器,以获得 Kison 解决方案中的动态性:

class Foo {
    public function setProperty($name, $value) {
        $this->$name = $value;
    }
}

然后在 Twig 中:

{% do obj.setProperty('property2', 'Second property') %}

这比 Kison 的解决方案更简单,比 Martin 的解决方案更具动态性。但是,如果您有许多类需要这种通用设置器,那么 Kison 的解决方案可能会更好,因为它更通用(即您可以向任何类的对象添加属性)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    • 2015-11-15
    • 2015-09-21
    • 2018-11-20
    相关资源
    最近更新 更多