Php Symfony 2.8:无法获取服务中的当前用户(FosUserBundle)
我试图访问服务中的用户,以便跟踪最新的活动。但是,它会抛出一个错误: 错误:对非对象调用成员函数getUser() 但是如果我var\u dump和die()用户对象我可以看到信息 有什么想法吗 ActivityListenerPhp 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
<?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);
}