如何在特定查询上覆盖教义@userAware注释/过滤器?

时间:2019-02-26 13:21:24

标签: symfony doctrine

我遵循this instruction创建一个@userAware批注,该批注自动将对特定实体的所有查询限制为当前用户。

例如$todoRepo->findByTag("someTag")会自动将WHERE user_id = 123添加到结果查询中,以确保只能访问当前用户(id 123)的ToDo个实体。

这很好用,但有一个很大的缺点:例如,如果管理员想知道有多少ToDo个实体使用标签someTag,他只会找到自己的实体...

由于使用@userAware注释似乎很常见,所以我想知道是否有关于在特定查询上禁用/跳过/覆盖此过滤器/注释的最佳实践。

1 个答案:

答案 0 :(得分:1)

您可以禁用过滤器。在您的示例中,您必须更改内核请求事件,例如...

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);
        }
    }
}