如何从symfony 2中的视图层访问安全上下文令牌?

Geo*_*org 15 symfony

如果我在会话中存储了一个用户对象,我可以使用以下内容检索twig中的用户名:

app.session.get('user').UserName
Run Code Online (Sandbox Code Playgroud)

但是我的用户对象(UserInterface)驻留在安全上下文中,更具体地说是在userToken(TokenInterface)对象的用户字段中.如何从twig访问用户对象内的值?我正在考虑以下方面的事情:

app.security.context.token.user.[my_user_property]
Run Code Online (Sandbox Code Playgroud)

Pro*_*tic 23

安全上下文可从app全局获得security:

{{ app.security.getToken().getUser() }}
Run Code Online (Sandbox Code Playgroud)

将输出用户对象的字符串表示形式(或"anon."如果您尚未登录,但已通过身份验证).

请注意,除非您已声明公共属性,否则您必须使用getter/setter方法:

{{ app.security.getToken().getUser().getUsername() }}
Run Code Online (Sandbox Code Playgroud)

作为快捷方式,您可以使用set标记在模板中定义用户变量:

{% set user = app.security.getToken().getUser() %}
Run Code Online (Sandbox Code Playgroud)

并节省大量的打字,或从控制器传递.

  • 这完全是病态和愚蠢 - 一次symfony security.context-> getToken() - > getUser()返回User Entity Object,下次它返回一个string ="anon.".这是每一个原则,一个可怕的建设...... (3认同)

Reu*_*ven 20

在我们的项目中,我们使用app object.它是Symfony\Bundle\FrameworkBundle\Templating\GlobalVariables

此对象具有getUser在安全上下文中访问用户的方法.

所以在你的代码中你可以使用

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

在您的视图中检索用户.


小智 14

只需注意,Twig有一个功能,您可以在其中检查用户是否具有来自视图层的给定角色:

{% if is_granted('ROLE_USER') %}
    <a href="...">Delete</a>
{% endif %}
Run Code Online (Sandbox Code Playgroud)