Symfony 2.8:无法在服务中获取当前用户 (FosUserBundle) [英] Symfony 2.8: Cannot get current user in Service (FosUserBundle)

查看:28
本文介绍了Symfony 2.8:无法在服务中获取当前用户 (FosUserBundle)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试访问服务内的用户以跟踪最新活动.但是它会抛出一个错误:

I am trying to access the user inside a service in order to keep track of latest activity. However it throws an error:

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

Error: Call to a member function getUser() on a non-object

但是如果我 var_dumpdie() user object 我可以看到信息.

but if I var_dump and die() the user object I can see the information.

有什么想法吗?

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

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 }

推荐答案

如您所见:

/**
 * 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(当用户未登录时).

getToken() can return TokenInterface object or null (when user is not logged in).

把你的方法改成这样:

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 对象,那么一定是当侦听器被调用次数超过 1 次而没有用户信息.试着在这里回声来验证我的理论(在返回之前回声).它可以与子请求和丢失的身份验证数据连接.

And if you see User object on var_dump and die() then it must be the case when listener is called more times than one and then it don't have user information. Try to just echo something here to validate my theory (with echo before return). It can be connected with sub-requests and missing authentication data.

这篇关于Symfony 2.8:无法在服务中获取当前用户 (FosUserBundle)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆