EventSubscriber中的getUser实体

时间:2018-08-30 07:24:07

标签: symfony

我开始用symfony构建我的第一个Web应用程序。在这个应用程序中,我获得了具有身份验证和多语言功能的用户管理。在用户数据库表中是每个用户的lang列。我通过_GET参数更改了默认语言,并通过运行数据库值的登录名对其进行了更改。 现在,我想通过在EventSubscriber中通过URL _GET参数切换语言来自动更改数据库中的值。 不幸的是,我不知道如何在“ onKernelRequest”函数中获取用户实体,以将选择语言保存在数据库中。 更改语言的所有逻辑均通过以下代码完成:

  PARTITION BY LIST(is_big_data)
  SUBPARTITION BY KEY(district_id)
  SUBPARTITIONS 10
  (
    PARTITION pNormal VALUES IN (0),
    PARTITION pBigData VALUES IN (1)
  );

预先感谢 彼得

3 个答案:

答案 0 :(得分:1)

首先,我将拆分LocaleSubscriber类,并将onKernelRequestonInteractiveLogin移动到单独的侦听器/订户中,以减少对每个服务的依赖。

要在onKernelRequest事件中获得当前用户,您需要注入TokenStorage服务:

use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;

class LocaleSubscriber implements EventSubscriberInterface
{
    private $tokenStorage;
    private $em;

    public function __construct(
        TokenStorageInterface $tokenStorage, 
        EntityManagerInterface $em
    ) {
        $this->tokenStorage = $tokenStorage;
        $this->em = $em;
    }

    public function onKernelRequest(GetResponseEvent $event)
    {
        if (!$event->isMasterRequest()) {
            return;
        }

        if (!$token = $this->tokenStorage->getToken()) {
            return ;
        }

        if (!$token->isAuthenticated()) {
            return ;
        }

        if (!$user = $token->getUser()) {
            return ;
        }

        $request = $event->getRequest();

        // update user
        $user->setLocale($locale);

        $this->em->flush($user);

    }

}

请注意,这未经测试。

答案 1 :(得分:0)

空令牌的问题是错误的事件。我切换到“ KernelEvents :: CONTROLLER”。现在我有了用户实体。 我的工作代码:     

use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;

class UserLocaleSubscriber implements EventSubscriberInterface
{
    private $tokenStorage;
    private $em;
    private $allowedLangs;

    public function __construct(TokenStorageInterface $tokenStorage, EntityManagerInterface $em)
    {
        $this->tokenStorage = $tokenStorage;
        $this->em = $em;
        $this->allowedLangs = ['de', 'en'];
    }

    public function onKernelController(FilterControllerEvent $event)
    {
        $request = $event->getRequest();
        if (!$request->hasPreviousSession()) {
            return;
        }

        if(array_key_exists('_locale', $_GET) && array_search($_GET['_locale'], $this->allowedLangs) !== FALSE) {
            if (!$event->isMasterRequest()) {
                return;
            }

            if (!$token = $this->tokenStorage->getToken()) {
                return ;
            }

            if (!$token->isAuthenticated()) {
                return ;
            }

            if (!$user = $token->getUser()) {
                return ;
            }

            $locale = $_GET['_locale'];
            // update user
            $user->setLocale($locale);

            $this->em->flush($user);
            $request->setLocale($locale);
            $request->getSession()->set('_locale', $locale);
        }
    }

    public static function getSubscribedEvents()
    {
        return array(
            // must be registered before (i.e. with a higher priority than) the default Locale listener
            KernelEvents::CONTROLLER => array(array('onKernelController', 1)),
        );
    }
}

答案 2 :(得分:0)

实体存在于LifecycleEventArgs中。

public function prePersist(LifecycleEventArgs $args)
{
    $entity = $args->getEntity();