Получить РОЛЬ пользователя, не зарегистрированного в 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 %}