访问模板中的登录用户


94

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

我已经注册/登录和注销了。我现在想做的就是获取已登录的用户数据,并将其显示在我网站的每个页面上。就像事物的标题类型中的“ Hi用户名”一样。

似乎在我的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));
}

我从中获取:供应商/捆绑/FOS/UserBundle/Controller/ProfileController.php

Answers:


229

您可以直接在树枝模板中访问用户数据,而无需在控制器中请求任何内容。可以这样访问用户: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 %}

8
谢谢。我实际上将“ ROLE”更改为“ IS_AUTHENTICATED_REMEMBERED”,并且效果很好。
ed209 2011年

5
我没有使用FOSuserbundle(除非现在提供了它),但app.user.username仍然为我工作。可能对某些人有用。
杰森·斯威特

1
Symfony \ Bundle \ FrameworkBundle \ Templating \ GlobalVariables不是FOSUserBundle的一部分,这就是为什么它始终有效的原因(这是在2.5中定义细枝Globals的地方)(关于Jason Swett 3月30日)
DerStoffel

16

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

{{ app.user.getFirstname() }}

作为应用程序安全不推荐使用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 2015年

2
即使我同意上面关于不必要的评论,但我还是要对此表示赞同,因为它表明可以根据需要使用自定义方法
Simon

-1
{{ app 用户用户名 | 默认'' }} 

例如,仅提供当前的登录用户名,当用户不登录时,通过避免讨厌的错误消息,过滤器函数default('')应该很好。


2
以及它如何解决问题?也许您需要添加解释
Balwinder Singh
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.