Как получить доступ к данным другого пользователя?
Я работаю над веб-приложением Symfony 2.7, в котором используется FOSUserBundle. Пока все работает нормально. Не хотелось бы добавлять серверную часть администратора, которая позволяла бы отображать подробную информацию о разных пользователях.
Например, в приложении телефонной книги должно быть видно, сколько контактов создал выбранный пользователь:
$contact_count = $this->contactsCountForUser(5);
...
public function contactsCountForUser($user_id) {
$repo = $this->em->getRepository('AppBundle:Contact');
$qb = $repo->createQueryBuilder('c');
$qb->select('COUNT(c)');
$qb->where('c.user = :userId');
$qb->setParameter('userId', $user_id);
$sql = $qb->getQuery()->getSql();
$count = $qb->getQuery()->getSingleScalarResult();
return $count;
}
Это не удается, так как в качестве SQL-запроса создается следующее:
SELECT COUNT(c0_.guid) AS sclr0 FROM contact c0_ WHERE (c0_.user_id = ?) AND (c0_.user_id = '1')
Проблема 1:
Почему $qb->where('c.user = :userId')
переводится в c0_.user_id = ?
? Почему не используется 5 beeing как идентификатор пользователя?
Проблема 2:
AND (c0_.user_id = '1')
автоматически добавляется в запрос. Я предполагаю, что это делается с помощью FOSUserBundle, который ограничивает запрос текущим пользователем. Здесь идентификатор 1 - это идентификатор текущего вошедшего в систему пользователя, который является администратором... Очевидно, что (c0_.user_id = ?) AND (c0_.user_id = '1')
никогда не может быть правдой.
Итак: как мне убедить доктрину и/или FOSUserBundle в том, что администратор должен иметь возможность выполнять запросы к данным других пользователей?
1 answers
Благодаря комментарию @LBA я смог найти источник проблемы:
Фрагмент стороннего кода добавляет SQLFilter в качестве аннотации UserAware
. Эта веб-страница подробно описывает, что делается и как это работает.
Возможно, это может помочь другим избежать такого рода "проблем" и выяснить, что "неправильно":-)
О проблеме 1: Даже после решения проблемы 2 Проблема 1 остается прежней. Идентификатор пользователя по-прежнему преобразуется в ?
в запросе. Однако это, похоже, не влияет на функцию кода. Насколько я вижу, все работает так, как и ожидалось.