Доступ к авторизованному пользователю в шаблоне

94

Я использую FOSuserbundle, чтобы начать регистрацию пользователей https://github.com/FriendsOfSymfony/FOSUserBundle

У меня есть регистрация / вход и выход. Что я хочу сделать сейчас, так это получить данные зарегистрированных пользователей и представить их на каждой странице своего сайта. Как "Привет, имя пользователя" в заголовке типа вещи.

Похоже, что встраивание контроллера в мое приложение / Resources / views / base.html.twig - лучший способ сделать это http://symfony.com/doc/current/book/templating.html#embedding-controllers

Поэтому я написал свой контроллер для доступа к данным профиля пользователя. Я не могу понять, как получить доступ к методам FOS в моем встроенном контроллере. Итак, из моего Acme / UserBundle / Controller / UserController.php я хочу сделать это:

public function showAction()
{
    $user = $this->container->get('security.context')->getToken()->getUser();
    if (!is_object($user) || !$user instanceof UserInterface) {
        throw new AccessDeniedException(
               'This user does not have access to this section.');
    }

    return $this->container->get('templating')
      ->renderResponse('FOSUserBundle:Profile:show.html.'.$this->container
      ->getParameter('fos_user.template.engine'), array('user' => $user));
}

который я взял из: vendor / bundles / FOS / UserBundle / Controller / ProfileController.php

ed209
источник

Ответы:

229

Вы можете получить доступ к пользовательским данным прямо в шаблоне twig, ничего не запрашивая в контроллере. Пользователь доступен так: app.user.

Теперь вы можете получить доступ ко всем свойствам пользователя. Например, вы можете получить доступ к имени пользователя вроде: app.user.username.

Предупреждение, если пользователь не вошел в систему, значение app.userравно нулю.

Если вы хотите проверить, вошел ли пользователь в систему, вы можете использовать is_grantedфункцию twig. Например, если вы хотите проверить, есть ли у пользователя ROLE_ADMIN, вам просто нужно это сделать is_granted("ROLE_ADMIN").

Итак, на каждой из своих страниц вы можете:

{% if is_granted("ROLE") %}
    Hi {{ app.user.username }}
{% endif %}
Egeloen
источник
8
Спасибо. Я фактически изменил "РОЛЬ" на "IS_AUTHENTICATED_REMEMBERED", и это отлично сработало.
ed209
5
Я не использую FOSuserbundle (если он сейчас не входит в комплект), но app.user.usernameвсе равно работал у меня. Может быть, кому-нибудь будет полезно узнать.
Джейсон Светт
1
Symfony \ Bundle \ FrameworkBundle \ Templating \ GlobalVariables не является частью FOSUserBundle, поэтому это работает всегда (это то, где глобальные ветки определены в 2.5) (относительно Джейсона Светта 30 марта)
DerStoffel
16

Для Symfony 2.6 и выше мы можем использовать

{{ app.user.getFirstname() }}

поскольку глобальная переменная app.security для шаблона Twig устарела и будет удалена из версии 3.0

больше информации:

http://symfony.com/blog/new-in-symfony-2-6-security-component-improvements

и увидеть глобальные переменные в

http://symfony.com/doc/current/reference/twig_reference.html

зубаир Шаик
источник
4
вызов ненужного метода. Вы можете использовать такие динамические атрибуты {{ app.user.firstname }}. Думаю, он более удобен для фронтенд-разработчиков.
kacper3w
2
Несмотря на то, что я согласен с приведенным выше комментарием о том, что он не нужен, я собираюсь проголосовать за него, потому что он демонстрирует, что при желании можно использовать пользовательские методы
Саймон
-1
{{ app . пользователь . имя пользователя | по умолчанию ( '' ) }} 

Просто укажите имя пользователя для входа, например, функция фильтрации по умолчанию ('') должна быть приятной, когда пользователь НЕ входит в систему, просто избегайте раздражающего сообщения об ошибке.

Вэй Чжан
источник
2
и как это решить проблему? Возможно, вам нужно добавить пояснение
Бальвиндер Сингх