Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony 如何将变量共享到细枝中的所有视图(包括行为)?_Symfony_Twig - Fatal编程技术网

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中注册,这是一种方法。不过,嵌入式控制器处理子请求,这确实会带来一些开销,如触发事件侦听器等。根据用例的不同,这甚至可能是需要的,但人们应该知道这一点,以便做出正确的选择(只需将这一点留在这里,以便在选择哪种方式最合适时帮助做出任何决定)