【发布时间】:2016-08-16 07:30:03
【问题描述】:
我想在 twig 中为这个对象添加属性 2
object
property1
根据这个问题Updating object properties in twig接受的答案说可以通过合并来实现,但是合并过滤器对对象不起作用,有什么方法可以实现吗?
【问题讨论】:
-
写自定义的twig函数怎么样?
我想在 twig 中为这个对象添加属性 2
object
property1
根据这个问题Updating object properties in twig接受的答案说可以通过合并来实现,但是合并过滤器对对象不起作用,有什么方法可以实现吗?
【问题讨论】:
我认为最优雅的方式是使用 setter 和 getter:
class TestStdClass
{
private $prop1;
public function getProp1()
{
return $this->prop1;
}
public function setProp1($prop1)
{
$this->prop1 = $prop1;
}
}
然后在 Twig 模板中使用标签 do 来评估表达式(obj 是 TestStdClass 的一个实例):
{{ dump(obj) }} {# will print an empty object #}
{% do obj.setProp1('Hello') %}
{{ dump(obj) }}
这将打印:
TestStdClass {#2468 ▼
-prop1: "Hello"
}
【讨论】:
不知道在 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扩展时的必需函数
您还可以在您的类中添加一个通用设置器,以获得 Kison 解决方案中的动态性:
class Foo {
public function setProperty($name, $value) {
$this->$name = $value;
}
}
然后在 Twig 中:
{% do obj.setProperty('property2', 'Second property') %}
这比 Kison 的解决方案更简单,比 Martin 的解决方案更具动态性。但是,如果您有许多类需要这种通用设置器,那么 Kison 的解决方案可能会更好,因为它更通用(即您可以向任何类的对象添加属性)。
【讨论】: