Доступ до зареєстрованого користувача у шаблоні


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

Відповіді:


229

Ви можете отримати доступ до даних користувача безпосередньо в шаблоні гілочки, не вимагаючи нічого в контролері. Особа доступна так: 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 %}

8
Дякую. Я насправді змінив "ROLE" на "IS_AUTHENTICATED_REMEMBERED", і він чудово працював.
ed209

5
Я не використовую FOSuserbundle (якщо він зараз не постачається), але app.user.usernameвсе одно працював у мене. Комусь може бути корисно знати.
Джейсон Світт,

1
Symfony \ Bundle \ FrameworkBundle \ Templating \ GlobalVariables не є частиною FOSUserBundle, тому це працює завжди (саме там визначаються гілочки Globals у 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
{{ додаток . користувач . ім'я користувача | за замовчуванням ( '' ) }} 

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


2
і як це вирішує проблему? Можливо, вам потрібно додати пояснення
Balwinder Singh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.