Symfony2 получает идентификатор пользователя в хранилище сущностей
Я закодировал страницу, которая отображает всех администраторов системы. То, что я хочу сделать, это настроить мой запрос так, чтобы он исключал текущего аутентифицированного пользователя из списка.
Теперь я знаю, что могу получить user_id
от контроллера и передать его в хранилище сущностей, но мне было интересно, есть ли способ получить к нему доступ напрямую через хранилище сущностей?
Например:
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\NoResultException;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\User\UserProviderInterface;
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
class AdminUserRepository extends EntityRepository implements UserProviderInterface
{
public function getAdmins($int = 10, $offset = 0, array $orderBy = array('admin_id', 'asc')){
$admin_id = fetch the admin id ?;
$query = $this->createQueryBuilder('admins')
->where("admins.admin_id != '".$admin_id."'")
->orderBy('admins.'.$orderBy[0], $orderBy[1])
->setFirstResult($offset)
->setMaxResults($int)
->getQuery()
->getResult();
return $query;
}
}
2 ответа
Итак, у вас есть текущий идентификатор пользователя (скажем, $currentUserId
), и вы хотите написать запрос для всех пользователей с идентификатором, который не равен $currentUserId
?
Попробуй это:
class SomeController
{
public function someAction()
{
...
$qb = $userRepository->createQueryBuilder("user")
->where("user.id != ?1")
->setParameter(1, $currentUserId);
$usersExcludingCurrent = $qb->getQuery()->getResult();
...
}
}
редактировать
Ах, я понимаю, что вы говорите...
Что ж, хранилище действительно должно быть слепым ко всему, что находится за его пределами. То есть он не осведомлен о контейнерах и поэтому не должен знать, кто является текущим пользователем.
Мое предложение было бы дать вашему хранилищу функцию, которая получает все, кроме определенного пользователя или идентификатора пользователя. Что-то вроде:
class AdminUserRepository extends EntityRepository implements UserProviderInterface
{
public function getAllAdminsExcept($userId, $int = 10, $offset = 0, array $orderBy = array('admin_id', 'asc'))
{
...
}
}
А затем вставьте логику "текущего пользователя" в свой контроллер. Вы даже можете определить сервис, который имеет доступ к обоим @security
а также @doctrine
и разместите всю логику там. Ваш звонок, но я бы сказал, что вы обязательно должны хранить в своем хранилище информацию о том, что происходит в службе безопасности.
Вы можете получить пользовательский объект по
public function indexAction()
{
$user = $this->getUser();
}
Контроллер корыта или просмотр по шаблону Twig:
<p>Username: {{ app.user.username }}</p>
этот образец взят из Symfony 2 док.