2012-06-22 94 views
0

我的web應用程序作爲頂欄,我需要顯示未消息的郵件數量。每個User實體與Message(多對多)關聯。顯示消息的總數(給定用戶)將是簡單:在Symfony 2中分配一個全局的Twig變量?

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

在枝杈:

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

但如果我需要統計只新郵件?假設我的存儲庫有一個getNewMessages(User $user)方法,那麼如何將這個值全局分配用於每個模板?

我知道嫩枝全局,但我不知道我應該把相關代碼:

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

{{ text.lipsum(40) }} 

回答

3

我會註冊一個在每次請求發生的事件監聽器,可能是kernel.request事件。在偵聽器中,您可以檢查登錄的用戶,如果是,則使用新的郵件計數更新會話變量。然後你可以訪問這個會話變量的小枝app.session.msg_count

這也有優點,你可以緩存它,只有在某些條件下更新,以避免查詢每一個請求。

+0

你能解釋一下你的最後一句話?我應該如何緩存值以及哪些條件應該在請求時觸發新的查詢?謝謝。 – gremo

+0

這將取決於你。您將計數設置爲會話變量,因此它將持續會話。這就是我所說的「緩存」。如果請求是前一個請求的X秒/分鐘,那麼您只能重新查詢新消息。這個問題並不重要,只是它存儲在會話中的一個副作用。 – MDrollette

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> 

事後你可以訪問樹枝

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

變量,如果你想將l您可能希望傳遞一個對象並調用該對象的消息,以便消息計數僅在顯示時才需要。

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

另一種方式是實現其獲取的未讀郵件數爲當前用戶樹枝功能

1

如果您的用戶實體具有getUnreadMessages()方法,你可以使用{{ app.user.unreadMessages }}