树枝:如果用户在用户列表中(而不是当前用户)具有roleX,则显示一些内容。

时间:2018-11-11 16:01:15

标签: symfony twig

在Symfony 4中,我有几个不同的角色。我在Twig中有一个显示用户列表的视图。用户可以具有多个角色。在列表中,如果用户具有“ MANAGER”角色,我想显示一些文本。显示所有角色的步骤是:

{% for role in user.roles %}
    {{ role }}
{% endfor %}

现在,如果用户具有“ MANAGER”角色,我想显示一些文本。我尝试过:

{% for role in user.roles %}
    {% if (role is "MANAGER") %}
        Show some text.
    {% endif %}
{% endfor %}

但这会返回错误

  

值为“ MANAGER”的意​​外令牌“ string”(应为“ name”)。

当我使用{% if is "MANAGER") %}且出于某种原因而使用{% if "MANAGER") %}时,会显示相同的错误,无论用户是哪个角色,都为用户具有的每个角色都显示Show some text.。我究竟做错了什么?

3 个答案:

答案 0 :(得分:1)

作为对您自己发布的答案的回答:单个角色不是数组,包含运算符(请参阅https://twig.symfony.com/doc/2.x/templates.html#containment-operator)也支持检查子字符串,这就是这种情况。

因此,您检查作品,但是如果您具有“ MINI_MANAGER”角色(例如,

{% set role = "MINI_MANAGER" %}
{% if "MANAGER" in role %}
    Some text here.
{% endif %}

还将输出“此处有一些文本”。因此,更好的解决方案是:

{% for role in user.roles %}
    {% if role == "MANAGER" %}
    Some text here.     
    {% endif %}
{% endfor %}

当角色是布尔值“ true”时(这不是Twig问题,而是正常的PHP行为),这仍然可能导致问题,因此您也可以查看“ same as”测试,请参见{{ 3}}

{% for role in user.roles %}
    {% if role is same as("MANAGER") %}
    Some text here.     
    {% endif %}
{% endfor %}

答案 1 :(得分:0)

所以看来我已经知道了。似乎每个角色实际上都是一个数组,因此您必须像这样检查数组中的值:

{% for role in user.roles %}
    {% if "MANAGER" in role %}
    Some text here.     
    {% endif %}
{% endfor %}

我仍然不确定为什么单个角色是数组,但是肯定有一个原因。

答案 2 :(得分:0)

那呢?

{% if is_granted('ROLE_MANAGER') %} 
   Some text here 
{% endif %}

来源:Symfony2 security functions in Twig? How to check the user's role?

See also Symfony Doc

  

角色:用户登录后,会收到一组角色(例如,   ROLE_ADMIN)。