0

我的 Web 应用程序作为顶栏,我需要在其中显示未读消息的数量。每个User实体都作为一个关联Message(多对多)。显示消息总数(对于给定用户)很简单:

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

在树枝中:

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

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

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

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

{{ text.lipsum(40) }}
4

3 回答 3

3

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

这还有一个优点是您可以缓存它并仅在某些条件下更新,以避免对每个请求进行查询。

于 2012-06-23T00:00:13.540 回答
3

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

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

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

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

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

之后,您可以在 twig 中访问变量

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

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

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

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

于 2012-06-25T22:20:16.820 回答
1

如果您的 User 实体有一个getUnreadMessages()方法,您可以使用{{ app.user.unreadMessages }}

于 2012-07-03T14:15:29.010 回答