Я построил расширение ветки, чтобы сделать некоторые вещи, и один из них отображает шаблон. Как я могу получить доступ из внутреннего расширения ветки в среду движка и вызвать метод Render?
Шаблон рендеринга с расширением ветки
Ответ 1
Вы можете определить расширение так, чтобы он нуждался в среде. 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
С помощью этой функции пользователь может передать экземпляр среды twig на расширение ветки
private $environment;
public function initRuntime(\Twig_Environment $environment)
{
$this->environment = $environment;
}
Ответ 3
@tvlooy ответ, дайте мне подсказку, но не работает для меня. Для этого мне нужно было:
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');
}
}
Мне нужно добавить addtionaly 'is_safe' => ['html']
, чтобы избежать автоматического кэширования HTML.
Я также зарегистрировал класс как службу symfony:
app.twig.menu_extension:
class: AppBundle\Twig\MenuExtension
public: false
tags:
- { name: twig.extension }
в шаблоне TWIG я добавил {{ myMenu() }}
Я работаю с версией "twig/twig": "~1.10"
и Symfony 3.1.3