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イベントで発生するイベントリスナーを登録します。リスナーでは、ログインしているユーザーを確認できます。その場合は、セッション変数を新しいメッセージ数で更新します。次に、このセッション変数に小枝でアクセスできます。app.session.msg_count

これには、すべてのリクエストでクエリを実行しないように、キャッシュして特定の条件下でのみ更新できるという利点もあります。

于 2012-06-23T00:00:13.540 に答える
3

小枝拡張機能を作成して登録する必要があります。小枝拡張機能は、コード例と同じ方法でグローバルを提供できます。基になるコードをいくつか貼り付けます...

最初に任意のバンドルに拡張クラスを作成します

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 関数を実装することです

于 2012-06-25T22:20:16.820 に答える
1

User エンティティにgetUnreadMessages()メソッドがある場合は、使用できます{{ app.user.unreadMessages }}

于 2012-07-03T14:15:29.010 に答える