使用@Template批注

时间:2016-01-09 15:14:23

标签: php symfony annotations

我需要在Symfony项目的所有操作中返回默认数据。 例如,侧栏中的搜索表单,观众计数器等...

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

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

我找到了Add data to return of all actions in a Symfony controller解决方案,但在我使用@Template注释时失败了。

当然,我可以从树枝上调用render功能,但似乎不是快速和好主意。

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

1 个答案:

答案 0 :(得分:1)

Symfony最佳实践文档的Controllers部分建议不要使用@Template()注释,因此只需不使用@Template()即可轻松解决问题。

覆盖基本控制器渲染方法的原因不起作用是因为你实际上没有调用它,框架也没有。相反,SensioFrameworkExtraBundle @Template annotation通过为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's TemplateListener的实现以供参考。

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


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


在我看来,这在很大程度上比它的价值更麻烦,而且最好只删除@Template注释。 (作为奖励,您将获得轻微的性能提升,特别是如果您disable the annotations entirely,因为您不会在每次请求时都有调用这些事件侦听器的开销。)