2011-09-18 86 views
80

我使用FOSuserbundle上手的用户注册https://github.com/FriendsOfSymfony/FOSUserBundle访问登录的用户在模板

我知道了注册/登录和注销。我现在要做的是抓取登录的用户数据并将其显示在我网站的每个页面上。像“Hi用户名”在标题类型的东西。

好像在我应用程序/资源/视图/ base.html.twig嵌入控制器做到这一点http://symfony.com/doc/current/book/templating.html#embedding-controllers

所以我写了我的控制器来访问用户配置文件数据的最佳方式。我想不出的是如何在我的嵌入式控制器中访问FOS方法。所以从我的阿克米/ UserBundle /控制器/ 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 /控制器/ ProfileController.php

回答

205

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

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

警告,如果用户未登录,app.user为空。

如果你想检查用户是否登录,你可以使用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

为symfony1.2 2.6及以上,我们可以使用

{{ app.user.getFirstname() }} 

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

+4

不必要的方法调用。您可以使用像这个'{{app.user.firstname}}'这样的动态属性。我猜想它更符合前端开发。 – kacper3w

+2

尽管我同意上面关于不必要的评论,但我会对此表示赞同,因为它表明如果需要,可以使用自定义方法 – Simon

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

就目前的登录用户名,例如,过滤功能默认(“”)的全局变量应该是不错的,当用户没有通过登录避免烦人的错误信息。

+2

以及它如何解决问题?也许你需要添加解释 –