Получить РОЛЬ пользователя, не зарегистрированного в TWIG Symfony2

Я хотел бы знать, как я могу узнать, предоставлен ли пользователь, когда он не является текущим пользователем в twig.

Я использую этот код для текущего пользователя:

{% if is_granted('ROLE_USER') %}
    <a href="...">Delete</a>
{% endif %}

Но я хотел бы иметь возможность делать то же самое с пользователями ohter, которые не вошли в систему на данный момент. Спасибо.

Edit: На самом деле, я думаю, что нет прямого способа с веточкой проверить роль пользователя, который не аутентифицирован. Поэтому я сделал это непосредственно в шаблоне ветки, проверьте, является ли пользователь администратором или нет, затем установите var. (в моем вопросе я искал, как делать в списке пользователей.)

{% set from_user_is_admin = false %}
{% for role in from_user.getRoles() %} 
    {% if role == 'ROLE_ADMIN' %}{% set from_user_admin = true %}{% endif %}
    {% if role == 'ROLE_SUPER_ADMIN' %}{% set from_user_admin = true %}{% endif %}
{% endfor %}
{% if from_user_admin == false %}THIS USER IS NOT ADMIN{% endif %}

Ответы

Ответ 1

Я думаю, было бы намного проще, если бы вы реализовали функцию isGranted в объекте User:

Class User implements UserInterface {
    ...
    public function isGranted($role)
    {
        return in_array($role, $this->getRoles());
    }
}

Теперь вы можете легко проверить предоставленные роли на каждом уровне своего приложения. В PHP:

$user->isGranted("USER_ADMIN")

Или в Twig:

user.granted("USER_ADMIN")

Если вам нужно проверить роль для текущего пользователя, вы можете сделать это в Twig:

app.user.granted("USER_ADMIN")

Примечание: переменная "приложение" определена глобально.

Примечание 2: этот код может вызывать исключение, если вы используете его за пределами защищенной области вашего приложения, так как app.user будет NULL.

Ответ 2

Вы можете использовать аналогичную инструкцию для вышеупомянутого с помощью "not":

{% if not is_granted('ROLE_USER') %}
    <a href="...">Delete</a>
{% endif %}

или использовать инструкцию else:

{% if is_granted('ROLE_USER') %}
    <a href="...">Delete</a>
{% else %}
    {# something else for guest user, not logged in #}
{% endif %}

Ответ 3

Вы должны создать либо твист macro, либо функцию твига.

Создание macro очень просто, используя ваш код:

{% macro admin_status(from_user) %}
  {% set from_user_is_admin = false %}
  {% for role in from_user.getRoles() %} 
      {% if role == 'ROLE_ADMIN' %}{% set from_user_admin = true %}{% endif %}
      {% if role == 'ROLE_SUPER_ADMIN' %}{% set from_user_admin = true %}{% endif %}
  {% endfor %}
  {% if from_user_admin == false %}THIS USER IS NOT ADMIN{% endif %}
{% endmacro %}

Затем вы можете использовать его в том же файле, что и {% _self.admin_status(user) %}. Вы также можете переместить его в отдельный файл и использовать твист import, чтобы получить к нему доступ.

Создание функции twig - лучший вариант, подробности см. в разделе растяжки. Это сводится к созданию регулярной функции, которая может быть вызвана из ветки, поэтому возможен такой код:

{% if user_is_admin(user) %}

Вам также необходимо прочитать возможность создания пользовательских расширений twig.

Ответ 4

Я сделал это таким образом, имею этот фрагмент в глобальном файле twig, в моем случае layout.html.twig

{% set is_admin = false %}
{% if app.security.token.user.roles is iterable %}
    {% for role in app.security.token.user.roles %}
        {% if role == 'ROLE_ADMIN' or role == 'ROLE_SUPER_ADMIN'  %}
            {% set is_admin = true %}
        {% endif %}
    {% endfor %}
{% endif %}

то я могу использовать где угодно

{% if is_admin %}....{% endif %}