我的网络应用程序作为顶部栏我需要显示未完成消息的数量。每个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) }}
答案 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 }}