Twig: показать что-то, если у пользователя есть roleX в списке пользователей (не текущий пользователь). - PullRequest
0 голосов
/ 11 ноября 2018

В Symfony 4 у меня есть пара разных ролей. У меня есть вид в Twig, который показывает список пользователей. Пользователи могут иметь несколько ролей. В списке я хочу показать текст, если у пользователя есть роль «МЕНЕДЖЕР». Отображение всех ролей осуществляется с помощью:

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

Теперь, если у пользователя есть роль «МЕНЕДЖЕР», я хочу показать текст. Я попробовал:

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

но это возвращает ошибку

Неожиданный токен "string" со значением "MANAGER" (ожидается "name").

Та же ошибка отображается, когда я использую {% if is "MANAGER") %}, и когда я по какой-то причине использую {% if "MANAGER") %}, Show some text. отображается для каждой роли пользователя, независимо от того, какая это роль. Что я делаю неправильно?

Ответы [ 3 ]

0 голосов
/ 11 ноября 2018

А как насчет этого?

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

Источник: Функции безопасности Symfony2 в Twig? Как проверить роль пользователя?

См. Также Symfony Doc

Роли: когда пользователь входит в систему, он получает набор ролей (например, ROLE_ADMIN).

0 голосов
/ 12 ноября 2018

В качестве ответа на ваш собственный ответ: одна роль не является массивом, оператор сдерживания (см. 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", см. https://twig.symfony.com/doc/2.x/tests/sameas.html

{% for role in user.roles %}
    {% if role is same as("MANAGER") %}
    Some text here.     
    {% endif %}
{% endfor %}
0 голосов
/ 11 ноября 2018

Так что, похоже, я понял это.Кажется, что каждая отдельная роль на самом деле является массивом, поэтому вы должны проверить значение в массиве следующим образом:

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

Я все еще не уверен, почему одна роль является массивом, но естьконечно, причина для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...