全局值:定义为服务还是定义抽象Controller类?

时间:2014-04-22 07:34:49

标签: symfony inheritance service twig

在我的Symfony2应用程序中,我想在每个模板上全局从我的数据库中获取一个值,而不想在每个Controller上调用。我知道我可以将其定义为服务并将该服务注入我的twig模板(通过将其定义为全局树枝)。

这是常见的推荐方式吗?或者我应该创建一个抽象的Controller类,我在构造函数中获取该值,然后从我所有其他控制器继承?

注意:对于所有用户而言,它实际上不是一个静态值,但它是一个特定于用户的值,对于每个用户都是不同的。

3 个答案:

答案 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,而无需处理任何内容;)