【问题标题】:Access current user in the kernel events [Symfony 4]在内核事件中访问当前用户 [Symfony 4]
【发布时间】:2023-03-27 00:36:01
【问题描述】:

我不想保存我的用户的导航。

我正在尝试将其从'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,
        );
    }
}

【问题讨论】:

  • 你为什么不注入TokenStorageInterface
  • 尝试通过 Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface 作为依赖注入,然后调用类似这样的东西 $user = $tokenStorage->getToken() ? $tokenStorage->getToken()->getUser() : null;
  • 你在开发环境吗?如果是,工具栏是否显示您已作为特定用户连接?
  • 我尝试注入 TokenStorageInterface,结果是一样的……是的,我的调试栏显示了我的用户。

标签: php symfony symfony4


【解决方案1】:

我收到了回复!

开发环境太快了,我觉得……

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();
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-10
    • 2019-10-02
    • 2017-10-14
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多