在Symfony 2中分配全局Twig变量?

时间:2012-06-22 23:36:23

标签: symfony twig

我的网络应用程序作为顶部栏我需要显示未完成消息的数量。每个User实体与Message(多对多)关联。显示消息总数(对于给定用户)很简单:

class User
{
    /*
     * @ORM\ManyToMany(targetEntity="Message", invertedBy="users")
     */
    private $messages;
}

在Twig:

Total messages: {{ app.user.messages|length }}.

但是如果我需要计算只有新消息呢?假设我的存储库有一个getNewMessages(User $user)方法,如何全局分配这个值以在每个模板中使用?

我知道Twig全局,但我不知道我应该把相关代码放在哪里:

$twig = new Twig_Environment($loader);
$twig->addGlobal('text', new Text());

{{ text.lipsum(40) }}

3 个答案:

答案 0 :(得分:3)

我会在每个请求上注册一个事件监听器,可能是kernel.request事件。在侦听器中,您可以检查已登录的用户,如果是,则使用新的消息计数更新会话变量。然后,您可以使用app.session.msg_count

在树枝中访问此会话变量

这也有一个优点,你可以缓存它,只在某些条件下更新,以避免查询每个请求。

答案 1 :(得分:3)

您需要创建并注册一个树枝扩展名。 twig扩展可以像代码示例一样以相同的方式提供全局变量。我会粘贴一些你可以依据的代码......

首先在任何包中创建扩展类

class FooBarTwigExtension extends \Twig_Extension
{
    public function getGlobals()
    {
      return array(
        'foo'=> $this->bar,
      );
    }
}

然后在捆绑服务定义中将其注册为twig扩展

<service id="acme.foo_bundle.twig_extension" class="Acme\FooBundle\Twig\FooBarExtension">
  <tag name="twig.extension" />
  <argument ...>
</service>

之后你可以在树枝中访问变量

<h1>{{foo}}</h1>

如果你想使用延迟初始化,你可能想要传入一个对象并调用该对象的消息,因此只有在显示它时才需要消息计数。

<h1>{{messaging.countUnread}} new messages</h1>

另一种方法是实现一个twig函数,用于获取当前用户的未读消息计数

答案 2 :(得分:1)

如果您的用户实体使用getUnreadMessages()方法,则可以使用{{ app.user.unreadMessages }}