Php 向细枝中的对象添加特性
我想在twig中将属性2添加到此对象Php 向细枝中的对象添加特性,php,twig,Php,Twig,我想在twig中将属性2添加到此对象 object property1 根据这个问题,公认的答案是可以通过合并实现,但是合并过滤器不能处理对象,有什么方法可以实现吗 我不知道用小树枝做这件事的标准方法,但我认为你可以这样做: 1。创建客户细枝扩展 class TwigPropertySetter extends \Twig_Extension { function getName() { return 'property_setter'; }
object
property1
根据这个问题,公认的答案是可以通过合并实现,但是合并过滤器不能处理对象,有什么方法可以实现吗 我不知道用小树枝做这件事的标准方法,但我认为你可以这样做: 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 }}
....
注意:未经测试我认为最优雅的方法是使用setter和getter:
class TestStdClass
{
private $prop1;
public function getProp1()
{
return $this->prop1;
}
public function setProp1($prop1)
{
$this->prop1 = $prop1;
}
}
然后在细枝模板中,使用标记计算表达式(obj
是TestStdClass
的一个实例):
这将打印:
TestStdClass {#2468 ▼
-prop1: "Hello"
}
您还可以向类中添加一个通用setter,以获得Kison解决方案中的动态性:
class Foo {
public function setProperty($name, $value) {
$this->$name = $value;
}
}
然后在细枝上:
{% do obj.setProperty('property2', 'Second property') %}
这比Kison的解更简单,比martin的解更动态。但是,如果您有许多类需要这种通用setter,那么Kison的解决方案可能会更好,因为它更通用(即,您可以向任何类的对象添加属性).编写自定义细枝函数怎么样?
getName
是从twig\u扩展扩展时所必需的函数。这样,您需要在每个类中为每个属性添加getter和setter。当然,若我们将这样编写代码,这将更加清楚,但这并不是向对象附加新属性的通用方法。我的解决方案可以直接添加属性,而无需getter和setter。
{% do obj.setProperty('property2', 'Second property') %}