我有一个使用SF 3.4的大型应用程序,我需要找到一种更好的方法来在每个页面加载时根据用户进行自定义渲染。
现在我们有听众的侧面菜单,页脚,侧面菜单收藏夹,应用程序菜单,以及您是否超时。这些侦听器通过渲染功能触发主题事件,该功能添加与用户访问/收藏/有关的信息(如果超时)。这不能用twig中的角色来完成,因为我们有像菜单收藏夹一样的东西,它们一直在变化。
我们重写Controller渲染方法来调度那个主题事件和array_merge我们得到的渲染函数的参数数组如下:
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);
}
由于这个原因,我们的大多数控制器都扩展了ExampleThemeController,而不仅仅是Controller,所以我们希望每个页面都有这些功能。
这样可以正常工作,但是渲染方法已经标记为SF 3.4的最终版本,不应该被覆盖。如果不重写render方法,最好的方法是什么?还有另一个地方可以发送我们的主题活动吗?
我们已经尝试过onKernelController订阅者/侦听器无济于事,因为我们需要将额外的视图参数添加到容器中,而这在当时是无法完成的。
谢谢!
答案 0 :(得分:0)
对于除了将全局变量传递给twig之外的特定于用户的更改,我会查看embedding controllers。您可以使用不同的控制器呈现响应的一部分,例如,仅负责收藏夹。