【问题标题】:Symfony 2.8: Cannot get current user in Service (FosUserBundle)Symfony 2.8:无法在服务中获取当前用户(FosUserBundle)
【发布时间】:2016-04-18 08:36:53
【问题描述】:

我正在尝试访问服务中的用户以跟踪最新活动。但是它会引发错误:

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

但如果我 var_dumpdie() 用户对象 我可以看到信息。

有什么想法吗?

活动监听器

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

services.yml

 app.activityListener:class: AppBundle\EventListener\ActivityListener
     arguments: [ @security.token_storage, @doctrine.orm.entity_manager ]
     tags: - { name: kernel.event_listener, event: kernel.controller, method: onCoreController }

【问题讨论】:

标签: php symfony


【解决方案1】:

如您所见:

/**
 * 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_dumpdie() 上看到 User 对象,那么一定是侦听器被调用多次并且没有用户信息的情况。尝试在这里回显一些东西来验证我的理论(在返回之前使用回声)。它可以与子请求和缺少的身份验证数据相关联。

【讨论】:

    【解决方案2】:

    如前人所说,代码可能会多次遍历事件监听器。我会检查该请求是否是主请求,如果不是,请继续。之后,从令牌加载用户并检查它是否真的是一个用户对象,因为它很可能不是,如果不是,再次继续。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-02
      • 1970-01-01
      • 2017-06-21
      • 1970-01-01
      • 1970-01-01
      • 2015-09-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多