提问者:小点点

Symfony 3.4-在每个页面加载上渲染自定义视图




我有一个使用SF 3.4的大型应用程序,我需要找到一种更好的方法,根据每个页面加载的用户进行自定义渲染

现在我们有了侧菜单、页脚、侧菜单收藏夹、应用程序菜单以及是否超时的侦听器。这些侦听器通过render函数触发主题事件,该函数添加与用户访问/收藏夹/超时有关的信息。twig中的角色无法做到这一点,因为我们的菜单收藏夹之类的东西随时都在变化

我们重写Controller render方法来调度该主题事件,并将返回的内容与呈现函数的参数数组合并,如下所示:

  protected function render($view, array $parameters = array(), Response $response = null)
  {
        $themeEvent = new ExampleThemeEvent($this->getUser(), $this->getMyMenuApplication());

        $result = $this->getDispatcher()->dispatch(ExampleThemeEvent::NAME, $themeEvent);

        $parameters = array_merge($result->getModel(),$parameters);

      return parent::render($view, $parameters, $response);
  }

正因为如此,我们的大多数控制器都扩展了ExampleTheMacontroller,而不仅仅是控制器,所以我们想要的每个页面都有这些功能。

这工作正常,但从SF 3.4开始,渲染方法已被标记为final,不应被重写。在不重写render方法的情况下,实现此目的的最佳方法是什么?还有别的地方可以派我们的主题活动吗
我们尝试了onKernelController订阅者/监听器,但没有效果,因为我们需要向容器中添加额外的视图参数,而此时无法完成

谢谢!


共1个答案

匿名用户

对于这种用户特定的更改,除了将全局变量传递给twig之外,我还想查看嵌入控制器。您可以使用不同的控制器呈现部分响应,例如,仅负责收藏夹。