Symfony 5 + Doctrine - 根据当前用户为每个请求添加过滤器

Symfony 5 + Doctrine - Add a Filter to every request, based on current user

我正在尝试为我的控制器的某些操作动态设置“tenant_id”过滤器。

我构建了一个 class,它扩展了 SQLFilter 并在 addFilterConstraint 中放入了执行此操作的逻辑。

问题是动态“租户”参数:

如果我将这段代码放入我的每个控制器操作中,它就会起作用:

$em->getFilters()->getFilter('tenant')->setParameter('tenant_id', $security->getUser()->getTenant()->getId());

当然这是不可维护的,所以我试图将这个逻辑移到其他地方,以使其更清晰、更易于维护。

我正在考虑类似事件的东西,但我需要在每个 Request 上发送一个 Event,当 Security 已经完成它的工作时,然后我需要修改EntityManager.

有什么想法吗?

谢谢

您正在寻找活动订阅者(Ref

这是一个示例,您可以使用它来显示对实体管理器和安全性的访问 类。将此文件放在 src/EventSubscriber/TenantFilterEventSubscriber.php 中,然后每个请求都会 运行。

namespace App\EventSubscriber;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ControllerEvent;
use Symfony\Component\Security\Core\Security;
use Doctrine\ORM\EntityManagerInterface;

class TenantFilterEventSubscriber implements EventSubscriberInterface
{
    protected $security;

    public function __construct(Security $security, EntityManagerInterface $entityManager)
    {
        $this->security = $security;
        $this->entityManager = $entityManager;
    }

    public function onKernelController(ControllerEvent $event)
    {
        $controller = $event->getController();

        if (!is_array($controller)) return;

        if ($controller[0] instanceof YourController) {
            $user = $this->security->getUser();

            if (null !== $user) {
                // Do stuff
            }
        }
    }

    public static function getSubscribedEvents()
    {
        return array(
            'kernel.controller' => 'onKernelController',
        );
    }
}