I have built a twig extension to do some things and one of them is render a template. How can I access from inside the twig extension the engine environment and call the Render method?
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
回答1:
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)
{
// ...
}
回答2:
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;
}
回答3:
@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