使用@Template注释在所有操作中添加数据返回


Add data return in all actions with @Template annotation

我需要在Symfony项目中的所有操作中返回默认数据。例如侧栏中的搜索表单、查看器计数器等…

所以我需要在所有操作中返回一些默认数据

return array(
    'form' => $form->createView(),
    'short_search' => $shortSearch->createView(),
);

我在Symfony控制器解决方案中找到了Add data以返回所有操作,但当我使用@Template注释时,它失败了。

当然,我可以从trick调用render函数,但这似乎不是一个快速而好的主意。

在这种情况下,我应该覆盖哪个组件???

Symfony最佳实践文档的Controllers部分建议不要使用@Template()注释,因此解决问题的简单方法就是不使用@Template()

重写基本控制器的渲染方法不起作用的原因是,您实际上并没有调用它,框架也没有。相反,SensioFrameworkExtraBundle@Template注释通过为KernelEvents::VIEWkernel.view)安装一个事件侦听器来工作,并且(如果需要,在使用不同的事件猜测模板名称之后)直接使用模板服务来呈现响应。


在一般情况下,您可以在kernel.view上安装一个优先级更高的事件侦听器,并使用提供的GetResponseForControllerResultEvent事件添加参数。这个事件监听器可能看起来像

use Symfony'Component'HttpKernel'Event'GetResponseForControllerResultEvent;
public function onKernelView(GetResponseForControllerResultEvent $event)
{
    $parameters = $event->getControllerResult();
    //modify parameters
    $event->setControllerResult($parameters);
}

使用任何必要的服务来获得通过依赖注入传递的附加参数。您可能还想查看@Template的TemplateListener的实现以供参考。

Symfony Cookbook提供了有关如何设置事件监听器的更多信息。


在您的特定情况下,您可能会完全从该事件处理程序中生成$form$shortSearch,因此至少,您的事件处理程序至少需要注入表单服务。


在我看来,这在很大程度上比它的价值更麻烦,最好只是删除@Template注释。(额外的好处是,您将获得轻微的性能提升,特别是如果您完全禁用注释,因为您不会在每次请求时都调用这些事件侦听器。)