Как получить список пользователей с определенной ролью контроллера Symfony
Я новичок в Symfony 2, работаю с FOSUserBundle вместе с PUGXMultiUserBundle, и у меня возникают проблемы с получением списка пользователей с определенной ролью, например: ROLE_ADMINISTRATEUR, чтобы уведомить их о чем-то. Во всяком случае, вдохновленный этим, это мой класс UserRepository:
<?php
namespace OC\UserBundle\Entity;
use Doctrine\ORM\EntityRepository;
class UserRepository extends EntityRepository
{
public function findByRoles($role)
{
$qb = $this->_em->createQueryBuilder();
$qb->select('u')
->from('OCUserBundle:User', 'u')
->where('u.roles LIKE :roles')
->setParameter('roles', '%"'.$role.'"%');
return $qb->getQuery()->getResult();
}
}
и это код внутри действия контроллера:
$em=$this->getDoctrine()->getManager();
$repository2=$em->getRepository('OCUserBundle:User');
$roles='ROLE_ADMINISTRATEUR';
$users=$repository2->findByRoles(array('roles'=>$roles));
Return $this->render('OCUserBundle:Default:test.html.twig',array(
'users'=>$users));
и моя страница test.html.twig:
{% for a in users %}
{{a.username}}
{% endfor %}
Все, что я получаю, это пустая страница. Любая помощь будет оценена
3 ответа
Решаемые. На самом деле, используя PUGXMultiUserBundle, вы можете выбрать из определенной таблицы (вы можете связать тип пользователя с ролью), поэтому я изменил действие внутри контроллера следующим образом:
$em=$this->getDoctrine()->getManager();
$repository2=$em->getRepository('OCUserBundle:UserAdministrateur');
$admins=$repository2->findAll();
Return $this->render('OCUserBundle:Default:test.html.twig',array(
'admins'=>$admins));
Работает как шарм. Надеюсь, это помогает кому-то.
Я пытаюсь сделать это и без PUGXMultiUserBundle с функцией:
$users = $repositoryUser->findByRoles("ROLE_SUPER_ADMIN");
Но это не работает, я получаю пустой массив, поэтому делаю это вручную:
$qb = $em->createQueryBuilder();
$qb->select('u') ->from('AppBundle:User', 'u') ->where('u.roles LIKE :roles') ->setParameter('roles', '%"'."ROLE_SUPER_ADMIN".'"%');
$users = $qb->getQuery()->getResult();
Может быть, это поможет людям, которые находятся в таком же случае со мной.
У меня просто была та же проблема, что и у ОП. Фактически, вещь с приведенным выше фрагментом кода из OP - это двойные кавычки: ->setParameter('roles', '%"'.$role.'"%');
Это не казалось правильным с первого взгляда. Изменился на: ->setParameter('roles', '%'.$role.'%');
и все работает отлично.
Вы пытались исправить эту строку:
$users=$repository2->findByRoles(array('roles'=>$roles));
От:
$users=$repository2->findByRoles('ROLE_ADMINISTRATEUR');
?
Ваш метод, кажется, ищет пользователей для ОДНОЙ роли. Условие LIKE ожидает строку, а не массив.
Тогда метод будет больше похож на findByRole(), а не findByRoles ().