在我的Symfony2应用程序中,我想在每个模板上全局从我的数据库中获取一个值,而不想在每个Controller上调用。我知道我可以将其定义为服务并将该服务注入我的twig模板(通过将其定义为全局树枝)。
这是常见的推荐方式吗?或者我应该创建一个抽象的Controller类,我在构造函数中获取该值,然后从我所有其他控制器继承?
注意:对于所有用户而言,它实际上不是一个静态值,但它是一个特定于用户的值,对于每个用户都是不同的。
答案 0 :(得分:2)
如果使用此变量在页面上呈现相同位置,则可以呈现embedded controller。像这样:
<div id="sidebar">
{{ render(controller('YourBundle:User:stats')) }}
</div>
这会将YourBundle / UserController / statsAction的整个输出注入#sidebar div。在此操作中,您可以提取所需的所有信息。
如果您需要以其他方式使用此变量,您可以查看response event。
答案 1 :(得分:2)
您熟悉事件监听器吗? http://symfony.com/doc/current/cookbook/service_container/event_listener.html
可以使用事件侦听器来注入twig全局变量。
class ModelEventListener extends ContainerAware implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return array(
KernelEvents::CONTROLLER => array(
array('doProject', -1300),
),
KernelEvents::VIEW => array(
array('doView', -2100),
),
);
}
public function doProject(FilterControllerEvent $event)
{
$project = $whatever_is_needed_to_find_the_project();
if (!$project) throw new NotFoundHttpException('Project not found ' . $projectSearch);
// Add to request
$event->getRequest()->attributes->set('project',$project);
// Give all twig templates access to project
$twig = $this->container->get('twig');
$twig->addGlobal('project',$project);
}
# services.yml
cerad_core__model__event_listener:
class: '%cerad_core__model__event_listener__class%'
calls:
- [setContainer, ['@service_container']]
tags:
- { name: kernel.event_subscriber }
答案 2 :(得分:1)
如果它是您所说的用户价值,您可以在每个树枝模板上获得app.user.XXX
,而无需处理任何内容;)