Как переопределить Doctrine @userAware annotion / filter для конкретного запроса? - PullRequest
0 голосов
/ 26 февраля 2019

Я следую этой инструкции , чтобы создать аннотацию @userAware, которая автоматически ограничивает все запросы по определенным объектам для текущего пользователя.

Например, $todoRepo->findByTag("someTag") автоматически добавит WHERE user_id = 123к результирующему запросу, чтобы убедиться, что доступны только ToDo сущности текущего пользователя (id 123).

Это прекрасно работает, но имеет один большой недостаток: если, например, администратор узнает, сколько ToDo сущностей использует тег someTag, он найдет только свои собственные сущности ...

Поскольку использование аннотации @userAware представляется довольно распространенным, мне интересно, есть ли лучший способ отключить / обойти / переопределить этот фильтр / аннотацию для конкретного запроса.

1 Ответ

0 голосов
/ 26 февраля 2019

Вы можете отключить фильтр.В вашем примере вы должны изменить событие запроса ядра, например ...

public function onKernelRequest()
{
    if ($user = $this->getUser()) {
        if ($user->isAdmin() /* or whatever */) {
             $this->em->getFilters()->disable('user_filter');
        } else {
             $filter = $this->em->getFilters()->enable('user_filter');
             $filter->setParameter('id', $user->getId());
             $filter->setAnnotationReader($this->reader);
        }
    }
}
...