2016-04-18 17 views
2

最新の活動を追跡するために、サービス内のユーザにアクセスしようとしています。しかし、それはエラーがスローされます。symfony 2.8:サービス(FosUserBundle)で現在のユーザを取得できません

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

しかし、もし私のvar_dumpダイ()ユーザーオブジェクト私が情報を見ることができます。

アイデア?

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 } 
+0

可能な複製http://stackoverflow.com/questions/19144505/symfony2-get-userid-on-kernel-controller-event-listener –

答えて

4

あなたがここに見ることができるように:

/** 
* Returns the current security token. 
* 
* @return TokenInterface|null A TokenInterface instance or null if no authentication information is available 
*/ 
public function getToken(); 

getToken()はTokenInteを返すことができます。オブジェクトまたは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()にユーザーオブジェクトを参照してください場合は、リスナーが1以上回呼び出されたとき、それはケースでなければならず、それがユーザー情報を持っていません。私の理論を検証するためにここに何かをエコーし​​てみてください。これは、サブリクエストおよび欠落した認証データと接続することができます。

0

前の人が言ったように、コードはおそらくイベントリスナーを複数回経由します。私は、リクエストがマスターリクエストであるかどうかをチェックし、そうでなければ移動します。その後、トークンからユーザーをロードし、実際にユーザーオブジェクトであるかどうかを確認します。これは、そうでなければ、再び移動しない可能性があるためです。

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); 
} 
関連する問題