TokenStorage有时会在Service中返回null

时间:2015-09-15 16:00:05

标签: symfony-2.6

我有一个获得当前登录用户的服务,该服务仅在开发环境中有效。

问题似乎是每当我更改Twig模板并刷新时我都会收到错误:

Error: Call to a member function getUser() on null

如果我刷新页面,一切正常,直到我再次更新Twig模板。这显然使得开发非常缓慢,因为我不断刷新页面。

到目前为止我所做的事情: -

  1. 清除了开发环境缓存。
  2. 清除浏览器缓存。
  3. 确认用户肯定已登录(否则无法登录) 工作在第二次刷新)
  4. 有没有人有任何想法可能导致问题?

    services.yml

    myservice:
        class: AppBundle\Services\MyService
        arguments: ["@doctrine.orm.entity_manager", "@security.token_storage"]
    

    MyService.php

    <?php
    namespace AppBundle\Services;
    use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
    
    class MyService
    {
        private $em;
        private $token;
    
        public function __construct($entityManager, TokenStorageInterface $tokenStorage)
        {
            $this->em = $entityManager;
            $this->token = $tokenStorage->getToken();
        }
    
        public function doSomething()
        {
            $user_id = $this->token->getUser()->getID();
            return;
        }
    }
    

    树枝模板

    {{ myservice.doSomething }}
    

    注意: 这是仍会导致问题的简单代码

1 个答案:

答案 0 :(得分:5)

我不确定,但在我看来,你的类应该维护一个指向tokenStorage类的指针,而不是令牌本身(因为这可能会改变)。您的服务将如下所示:

class MyService
{
   private $em;
   private $tokenStorage;

   public function __construct($entityManager, TokenStorageInterface $tokenStorage)
   {
       $this->em = $entityManager;
       $this->tokenStorage = $tokenStorage;
   }

   public function doSomething()
   {
       $user_id = $this->tokenStorage->getToken()->getUser()->getID();
       return;
   }
}