To change the specific index of the array that is best suited for the Twig extension, the solution could be this:
ProjectTwigExtension.php
namespace Your\Namespace; class ProjectTwigExtension extends Twig_Extension { public function getFunctions() { return array( new Twig_SimpleFunction('set_array_value', array($this, 'setArrayValue'), ['needs_context' => true,]), new Twig_SimpleFunction('set_object_property', array($this, 'setArrayValue'), ['needs_context' => true,]), ); } public function setArrayValue(&$context, $array_name, $index, $value) { if (!isset($context[$array_name])) return; if (is_array($context[$array_name])) $context[$array_name][$index] = $value; elseif(is_object($context[$array_name])) { if (method_exists($context[$array_name], $index)) $context[$array_name]->{$index}($value); elseif(method_exists($context[$array_name], 'set'.$index)) $context[$array_name]->{'set'.$index}($value); } } public function getName() { return 'ProjectTwigExtension'; } }
Add extension to twig
$twig->addExtension(new \Your\Namespace\ProjectTwigExtension()); $user = new User(); $user->setUserName('admin'); $twig->render('template.twig', [ 'somearray' => ['foo' => 'bar',], 'user' => $user, ]);
template.twig
{{ dump(somearray) }} {# output: array(1) { ["foo"]=> string(3) "bar" } #} {{ set_array_value('somearray', 'foo', 'foobar') }} {{ dump(array) }} {# output: array(1) { ["foo"]=> string(6) "foobar" } #} {{ dump(user.getUserName()) }} {# output: string(5) "admin" #} {{ set_object_property('user', 'UserName', 'StackOverflow') }} {{ dump(user.getUserName()) }} {# output: string(13) "StackOverflow" #}
source share