访问模板中的登录用户

ed2*_*209 92 symfony twig fosuserbundle

我正在使用FOSuserbundle开始用户注册https://github.com/FriendsOfSymfony/FOSUserBundle

我已经注册/登录和注销了.我现在要做的是获取登录用户数据并将其呈现在我网站的每个页面上.像标题类型的东西中的"Hi username".

似乎在我的app/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));
}
Run Code Online (Sandbox Code Playgroud)

我从中获取:vendor/bundles/FOS/UserBundle/Controller/ProfileController.php

ege*_*oen 227

您可以直接在树枝模板中访问用户数据,而无需在控制器中请求任何内容.用户可以像这样访问:app.user.

现在,您可以访问用户的每个属性.例如,您可以访问以下用户名:app.user.username.

警告,如果未记录用户,app.user则为null.

如果要检查用户是否已记录,可以使用is_grantedtwig功能.例如,如果要检查用户是否有ROLE_ADMIN,则只需执行此操作is_granted("ROLE_ADMIN").

因此,您可以在每个页面中执行以下操作:

{% if is_granted("ROLE") %}
    Hi {{ app.user.username }}
{% endif %}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢.我实际上改变了"IS_AUTHENTICATED_REMEMBERED"的"ROLE"并且效果很好. (8认同)
  • 我没有使用FOSuserbundle(除非它现在附带),但`app.user.username`仍然适用于我.对于有人知道可能有用. (5认同)

Hah*_*ahn 13

对于symfony 2.6及以上版本,我们可以使用

{{ app.user.getFirstname() }}
Run Code Online (Sandbox Code Playgroud)

由于不推荐使用Twig模板的app.security全局变量,因此将从3.0中删除

更多信息:

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

并查看全局变量

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

  • 不必要的方法调用 您可以使用像`{{app.user.firstname}}`这样的动态属性.我猜这是前端开发友好的. (4认同)
  • 即使我同意上面关于不必要的评论,我也会赞成这一点,因为它证明了如果需要可以使用自定义方法 (2认同)