TokenStorage иногда возвращает null в Service

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

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

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

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

Вещи, которые я сделал до сих пор: -

  • Очистил кеш-сервер dev.
  • Очистил кеш браузера.
  • Подтверждено, что пользователь определенно зарегистрировался (в противном случае он не будет работайте на втором обновлении)

Есть ли у кого-нибудь идеи, что может вызвать проблему?

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

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

Ответ 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;
   }
}