2013-09-16 1 views
1

Я использую Symfony2 с FOSUserBundle. Я создал метод, когда я спрашиваю, выполнил ли пользователь определенное действие, например. $user->hasVoted().Могу ли я сделать пользовательский метод доступным во всех шаблонах ветви?

В моих шаблонах прута, я хочу, чтобы иметь возможность спросить

{% if user.hasVoted() %} 

в каждый шаблон (потому что он имеет последствия, на которых другие обертоны включить), но я не хочу, чтобы пройти весь объект $user для каждого шаблона.

Есть ли способ сделать этот метод пользователя доступным во всех шаблонах (или я также могу передать логическое значение для всех шаблонов), не передавая это явно каждому шаблону?

Я знаю о injecting variables into all templates from the Symfony cookbook.

# app/config/config.yml 
twig: 
    # ... 
    globals: 
     ga_tracking: UA-xxxxx-x 

Но запись в поваренной книге либо указывает, как вводить статические значения (как в этом примере выше), так и как вводить службы.

Есть простой способ, как включить это одно логическое значение без определения услуги и ввести его как это:

# app/config/config.yml 
twig: 
    # ... 
    globals: 
     user_has_voted: "@acme_user.user_has_voted" 

ответ

4

аутентифицированный пользователь доступен через app.user везде.

{% if app.user.hasVoted() %} 

Или уборщик образом, вы создаете twig extension как is_granted. Это позволяет вам изменить логику в будущем, не изменяя шаблоны.

+0

Wow. Так просто. И теперь, когда я вижу этот ответ, я помню, что вы всегда можете получить доступ к текущему пользователю, как это. Благодаря! –

+2

Предупреждение. Если вы не вошли в систему, этот вызов завершится неудачно, я предлагаю {% app.user? app.user.hasVoted(): false%} –

+0

Да. Причина, по которой пользовательское расширение ветки больше. Там вы можете доказать это и другие вещи :) –

0

Может быть, вы хотите использовать «атрибут» функцию прут?

Нечто подобное я предполагаю:

{% if attribute(user, hasVoted) %} 

Надеется, что это помогает!

(как the doc определяет его здесь)

+0

Но разве это не означает, что я бы все равно придется пройти весь '$ объект user' каждому прутик? –

+1

Хм, ты прав, я думал, что это уже так, но предложение Пази намного лучше! (и не заставляет вас передавать весь пользователь на все ваши ветки!) –

3

Да, вы можете, в вашем ботинке расслоении() метод:

// src/Acme/DemoBundle/AcmeDemoBundle.php 
public function boot() 
{ 
    $hasVoted = $this->container->get('security.context')->getToken()->getUser()->hasVoted(); 
    $this->container->get('twig')->addGlobal('user_has_voted', $hasVoted); 
} 
+0

Мне нравится этот ответ (+1), но я предпочитаю Pazis. –

+0

Не знал о методе загрузки. @Paul, когда он называется? –

+1

Он вызван событием kernel.request –

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