Php Symfony 2.8:无法获取服务中的当前用户(FosUserBundle)

Php Symfony 2.8:无法获取服务中的当前用户(FosUserBundle),php,symfony,Php,Symfony,我试图访问服务中的用户,以便跟踪最新的活动。但是,它会抛出一个错误: 错误:对非对象调用成员函数getUser() 但是如果我var\u dump和die()用户对象我可以看到信息 有什么想法吗 ActivityListener <?php namespace AppBundle\EventListener; use AppBundle\Entity\User; use Symfony\Component\EventDispatcher\EventSubscriberInterface

我试图访问服务中的用户,以便跟踪最新的活动。但是,它会抛出一个错误:

错误:对非对象调用成员函数getUser()

但是如果我var\u dumpdie()用户对象我可以看到信息

有什么想法吗

ActivityListener

<?php

namespace AppBundle\EventListener;

use AppBundle\Entity\User;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;

class ActivityListener
{
    protected $tokenStorage;
    protected $em;

    public function __construct(TokenStorage $tokenStorage, \Doctrine\ORM\EntityManager $em)
    {
        $this->tokenStorage     =   $tokenStorage;
        $this->em               =   $em;
    }

    public function onCoreController(FilterControllerEvent $event)
    {
        $user = $this->tokenStorage->getToken()->getUser();

        if($user instanceof User)
        {
            $user->setLastActive(new \DateTime());

            $this->em->persist($user);
            $this->em->flush($user);
        }
    }
}
正如你在这里看到的:

/**
 * Returns the current security token.
 *
 * @return TokenInterface|null A TokenInterface instance or null if no authentication information is available
 */
public function getToken();
getToken()
可以返回TokenInterface对象或null(当用户未登录时)

将您的方法更改为:

public function onCoreController(FilterControllerEvent $event)
{
    if (is_null($token = $this->tokenStorage->getToken())) {
        return;
    }

    $user = $token->getUser();

    if($user instanceof User)
    {
        $user->setLastActive(new \DateTime());

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

如果您在
var\u dump
die()
上看到用户对象,那么当侦听器被调用多次,并且没有用户信息时,这种情况一定会发生。试着在这里附和一些东西来验证我的理论(在返回之前附和附和)。它可以与子请求和缺少的身份验证数据连接

正如前面的人所说,代码可能会在事件侦听器上运行多次。我会检查请求是否是主请求,如果不是,请继续。之后,从令牌中加载用户并检查它是否确实是用户对象,因为它很可能不是,如果不是,则继续

public function onCoreController(FilterControllerEvent $event)
{
    if (!$event->isMasterRequest() || !$this->tokenStorage->getToken()) {
        return;
    }

    $user = $this->tokenStorage->getToken()->getUser();

    if (!$user instanceof User) {
        return;
    }

    $user->setLastActive(new \DateTime());
    $this->em->persist($user);
    $this->em->flush($user);
}
可能重复的
public function onCoreController(FilterControllerEvent $event)
{
    if (!$event->isMasterRequest() || !$this->tokenStorage->getToken()) {
        return;
    }

    $user = $this->tokenStorage->getToken()->getUser();

    if (!$user instanceof User) {
        return;
    }

    $user->setLastActive(new \DateTime());
    $this->em->persist($user);
    $this->em->flush($user);
}