Agregar una propiedad a un objeto en ramita

Quiero agregar la propiedad 2 a este objeto en ramita

object property1 

Según esta pregunta Actualización de las propiedades del objeto en twig La respuesta aceptada dice que se puede lograr mediante merge, pero el filtro de fusión no funciona con objetos, ¿hay alguna forma de lograrlo?

Creo que la forma más elegante es usar setters y getters:

 class TestStdClass { private $prop1; public function getProp1() { return $this->prop1; } public function setProp1($prop1) { $this->prop1 = $prop1; } } 

Luego, en una plantilla de Twig use tag do para evaluar la expresión ( obj es una instancia de TestStdClass ):

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

Esto se imprimirá:

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

No conozco la forma estándar de hacerlo en twig, pero creo que puedes hacerlo así:

1. Crear una extensión de ramita custum

 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. Agregue una extensión a su procesador de ramitas

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

3. Use la función en su plantilla de ramita

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

Aviso: no probado

También puede agregar un setter general a su clase para obtener la dinámica como en la solución de Kison:

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

Y luego en Twig:

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

Esto es más simple que la solución de Kison y más dinámica que la solución de Martin. Sin embargo, si tienes muchas clases que necesitan este tipo de setter general, entonces la solución de Kison podría ser mejor ya que es más universal (es decir, puedes agregar propiedades a los objetos de cualquier clase).