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 док.

Другие вопросы по тегам