TokenStorage иногда возвращает null в службе

У меня есть служба, которая получает текущего вошедшего в систему пользователя, который работает только некоторое время в среде разработки.

Кажется, проблема заключается в том, что всякий раз, когда я меняю шаблоны Twig и обновляю их, я получаю сообщение об ошибке:

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

Если я обновлю страницу, все будет работать как надо, пока я снова не обновлю шаблон Twig. Это, очевидно, делает разработку очень медленной, так как я постоянно обновляю страницу.

Что я сделал до сих пор: -

  1. Очистил кеш среды разработки.
  2. Очистил кеш браузера.
  3. Подтверждено, что пользователь определенно вошел в систему (иначе это не сработает при втором обновлении)

У кого-нибудь есть идеи, что может быть причиной проблемы?

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

Шаблон Twig

{{ myservice.doSomething }}

Примечание. Это базовый код, который по-прежнему вызывает проблему


person Wizbyt    schedule 15.09.2015    source источник
comment
проверьте: stackoverflow.com/questions/24916638/   -  person Eray Balkanli    schedule 12.04.2016
comment
Привет, ты нашел причину проблемы? Я тоже это испытываю. Спасибо!   -  person iamjc015    schedule 26.06.2017


Ответы (1)


Я не уверен, но мне кажется, что ваш класс должен поддерживать указатель на класс 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;
   }
}
person ritter    schedule 27.09.2015