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',
);
}
}
我正在尝试为我的控制器的某些操作动态设置“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',
);
}
}