Symfony 如何将变量共享到细枝中的所有视图(包括行为)?
我有此控制器操作:Symfony 如何将变量共享到细枝中的所有视图(包括行为)?,symfony,twig,Symfony,Twig,我有此控制器操作: public function index(Request $request) { $start = $request->get('start', 0); $limit = $request->get('limit', 10); $articles = $this->articleRepository->all($start, $limit); $navigation = $
public function index(Request $request)
{
$start = $request->get('start', 0);
$limit = $request->get('limit', 10);
$articles = $this->articleRepository->all($start, $limit);
$navigation = $this->menu->build()->render(new RenderStrategyBootstrap4());
return $this->render('article/index.html.twig', [
'articles' => $articles,
'navigation'=>$navigation
]);
}
我使用以下命令创建菜单:
$navigation = $this->menu->build()->render(new RenderStrategyBootstrap4());
现在这是高级行为,我不想为每个动作都呈现它。在Symfony中是否有办法将此行为移动到一种视图生成器(如在Laravel中),然后与视图共享变量
或者没有办法,我需要创建一个基本控制器吗?您可以创建一个自定义的细枝扩展,如下所述: 在那里,您可以注册如下自定义细枝函数:
public function getFunctions()
{
return array('renderNavigation' => new TwigFunction(
'renderNavigation',
array($this, 'renderNavigation'),
array('needs_environment' => true, 'is_safe' => array('html'))
);
}
public function renderNavigation(Environment $twig)
{
/* ... */
return $twig->render(/* ... */);
}
然后您可以在每个模板中使用该函数,如{{renderNavigation()}
由于Twig扩展本身就是一个服务,因此您可以注入任何您需要的服务(如RequestStack、EntityManager等),如果需要多次运行,甚至可以在扩展中缓存昂贵的操作 您也可以随时在twig中注册,这是一种方法。不过,嵌入式控制器处理子请求,这确实会带来一些开销,如触发事件侦听器等。根据用例的不同,这甚至可能是需要的,但人们应该知道这一点,以便做出正确的选择(只需将这一点留在这里,以便在选择哪种方式最合适时帮助做出任何决定)