2011-09-18 6 views
80

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

Я получил его регистрацию/вход и выхода. Теперь я хочу захватить зарегистрированные данные пользователей и представить их на каждой странице моего сайта. Как «Привет имя пользователя» в заголовке типа вещи.

Похоже встраивание контроллер в моем приложение/Ресурсы/просмотров/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)); 
} 

, который я взял из: поставщика/жгуты/FOS/UserBundle/Controller/ProfileController.php

ответ

205

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

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

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

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

Таким образом, в каждой из ваших страниц, которые вы можете сделать:

{% if is_granted("ROLE") %} 
    Hi {{ app.user.username }} 
{% endif %} 
+7

спасибо. Я действительно изменил «ROLE» для «IS_AUTHENTICATED_REMEMBERED», и он отлично поработал. – ed209

+5

Я не использую FOSuserbundle (если только он не появился), но 'app.user.username' все еще работал на меня. Может быть полезно кому-то узнать. –

+0

Спасибо! Это должно быть намного яснее в документации. –

12

Для симфони 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

Несмотря на то, что я согласен с вышеприведенным комментарием о том, что я не нужен, я собираюсь повысить это, потому что он демонстрирует, что пользовательские методы могут быть использованы, если это необходимо – Simon

-1
{{ app.user.username|default('') }}

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

+2

и как решить эту проблему? Возможно, вам нужно добавить объяснение –