Render template from twig extension
You can define the extension so that it needs the environment. Twig will automatically pass it to the function.
use Twig\Environment;use Twig\TwigFunction;public function getFunctions(){ return [ new TwigFunction( 'myfunction', [$this, 'myFunction'], ['needs_environment' => true] ), ];}public function myFunction(Environment $environment, string $someParam){ // ...}
For older versions of Twig
public function getFunctions(){ return array( new \Twig_SimpleFunction( 'myfunction', array($this, 'myFunction'), array('needs_environment' => true) ), );}public function myFunction(\Twig_Environment $environment, string $someParam){ // ...}
Using this function the user can pass the twig environment instance to a twig extension
private $environment;public function initRuntime(\Twig_Environment $environment){ $this->environment = $environment;}
@tvlooy answer give me a hint but didn't work for me. What I needed to to to achieve it is:
namespace AppBundle\Twig;class MenuExtension extends \Twig_Extension{ public function getName() { return 'menu_extension'; } public function getFunctions() { return [ new \Twig_SimpleFunction('myMenu', [$this, 'myMenu'], [ 'needs_environment' => true, 'is_safe' => ['html'] ]) ]; } public function myMenu(\Twig_Environment $environment) { return $environment->render('AppBundle:Menu:main-menu.html.twig'); }}
I needed addtionaly add 'is_safe' => ['html']
to avoid autoescaping of HTML.
I've also registered the class as symfony service:
app.twig.menu_extension: class: AppBundle\Twig\MenuExtension public: false tags: - { name: twig.extension }
in TWIG template I've added {{ myMenu() }}
I work with "twig/twig": "~1.10"
and Symfony 3.1.3 version