2012-06-22 4 views
0

Мое веб-приложение в качестве верхней панели, где мне нужно отображать количество непрочитанных сообщений. Каждый объект User как ассоциация с Message (многие ко многим). Отображение общего количества сообщений (для данного пользователя) будет просто:Назначить глобальную переменную Twig в Symfony 2?

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

Я бы зарегистрировать прослушиватель событий, которое происходит при каждом запросе, вероятно, kernel.request события , В слушателе вы можете проверить зарегистрированного пользователя и, если это так, обновить переменную сеанса с новым количеством сообщений. Затем вы можете получить доступ к этой переменной сеанса в ветке с помощью app.session.msg_count

Это также имеет то преимущество, что вы можете кэшировать ее и обновлять только при определенных условиях, чтобы избежать запросов по каждому запросу.

+0

Можете ли вы объяснить ваш последнее предложение? Как я должен кэшировать значение и какие условия должны инициировать новый запрос по запросу? Благодарю. – gremo

+0

Это зависит от вас. Вы устанавливаете счет как сеанс var, чтобы он продолжал сеанс. Это все, что я подразумеваю под «кэшированием». Затем вы могли повторно запрашивать новые сообщения, если запрос был X секунд/минут после предыдущего. На самом деле это не важно, просто побочный эффект его хранения в сеансе. – MDrollette

3

Вам необходимо создать и зарегистрировать расширение ветки. Расширения twig могут предоставлять глобальные переменные таким же образом, как ваш пример кода. я буду вставлять вам код, на котором можно основывать на ...

сначала создать класс расширения в любом расслоении

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> 

, если вы хотите использовать л azy инициализации, которую вы, возможно, захотите передать в объекте и вызвать сообщение этого объекта, чтобы подсчет сообщений понадобился только тогда, когда он отображается.

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

другой путь будет реализовать функцию прут, который извлекает непрочитанных количество сообщений для текущего пользователя

1

Если объект Пользователь имеет метод getUnreadMessages(), вы можете использовать {{ app.user.unreadMessages }}

Смежные вопросы