我正在嘗試對我的控制器的某些操作動態設定“tenant_id”過濾器。
我已經構建了一個類,它擴展SQLFilter并放入addFilterConstraint邏輯中來做到這一點。
問題是動態“租戶”引數:
如果我將這段代碼放在我的每個控制器操作中,它會起作用:
$em->getFilters()->getFilter('tenant')->setParameter('tenant_id', $security->getUser()->getTenant()->getId());
當然,這是不可維護的,所以我試圖將這個邏輯移到其他地方,以使其更清晰、更易于維護。
我正在考慮類似事件的事情,但我需要Event在每個Request,當Security已經完成它的作業時,然后我需要修改EntityManager.
任何的想法?
謝謝
uj5u.com熱心網友回復:
您正在尋找事件訂閱者 ( 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',
);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/389876.html
