在内核事件中访问当前用户[Symfony 4]

时间:2018-09-11 12:54:01

标签: php symfony symfony4

我不想保存用户的导航。

我正在尝试从'kernel.request'事件中保存它,但无法获取当前用户...

在我的事件监听器中:

KernelEvents::REQUEST => ['logNavigation0']

函数:

public function logNavigation0(GetResponseEvent $event): void
    {
        dump(
            $event->getRequest()->getUser()
        );
    }

我的用户已连接,但getUser()返回我null

如何检索我的用户?还有另一种方法吗?

谢谢!

我的代码:

class PlayerAction implements EventSubscriberInterface, LogoutHandlerInterface
{
    private $mailer;
    private $requestStack;
    private $entityManager;
    private $tokenStorage;
    private $sender;
    protected $serializer;

    public function __construct(\Swift_Mailer $mailer, RequestStack $requestStack, EntityManagerInterface $entityManager, TokenStorageInterface $tokenStorage, $sender)
    {
        $this->mailer = $mailer;
        $this->requestStack = $requestStack;
        $this->entityManager = $entityManager;
        $this->tokenStorage = $tokenStorage;
        $this->sender = $sender;

        $this->serializer = new Serializer([new ObjectNormalizer()], [new JsonEncoder()]);
    }

    public static function getSubscribedEvents(): array
    {
        return [
            // le nom de l'event et le nom de la fonction qui sera déclenché
            Events::PLAYER_REGISTERED => ['logSuccessRegistration'],
            Events::PLAYER_UPDATED => ['logSuccessRegistration'],
            Events::PLAYER_PLAYING => ['logPlay'],
            Events::PLAYER_WINNING => ['logWin'],

            AuthenticationEvents::AUTHENTICATION_SUCCESS => ['logSuccessLogin'],
            AuthenticationEvents::AUTHENTICATION_FAILURE => ['logFailureLogin'],

            KernelEvents::REQUEST => ['logNavigation0'],
            KernelEvents::CONTROLLER_ARGUMENTS => ['logNavigation1'],
        ];
    }
    [...]
    public function logNavigation0(GetResponseEvent $event): void
    {
        dump(
            $event->getRequest()->getUser() //Return null,
        );
    }

public function logNavigation1(FilterControllerArgumentsEvent $event): void
    {
        dump(
            $event,
            $event->getRequest()->getUser(), //Return null,
            ($event->getArguments()),
            $this->tokenStorage->getToken() //Return null,
        );
    }
}

1 个答案:

答案 0 :(得分:0)

我得到了回应!

我认为开发环境太快了...

public function logNavigation(GetResponseEvent $event): void
{
    if(!empty($this->tokenStorage->getToken())) // In debug mode, it's null
    {
        /** @var Player $player */
        $player = $this->tokenStorage->getToken()->getUser();

        if($player instanceof Player)
        {
            $playerHystory = new PlayerHistory();
            $playerHystory
                ->setLabel('NAVIGATION')
                ->setDetails([
                    'path' => $event->getRequest()->getPathInfo(),
                    'method' => $event->getRequest()->getMethod()
                ])
                ->setPlayer($player)
                ->setIp($this->requestStack->getCurrentRequest()->getClientIp())
            ;

            $this->entityManager->persist($playerHystory);
            $this->entityManager->flush();
        }
    }
}