TokenStorage在Service中有时会返回null

11

我有一个服务,可以获取当前已登录的用户,但在开发环境中只能有时起作用。

问题似乎是每当我更改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 }}

注意:这是仍然导致问题的基本代码


请查看以下链接:http://stackoverflow.com/questions/24916638/symfony-dependency-injection-in-twig-extension - Eray Balkanli
嗨,你找到问题的原因了吗?我也遇到了同样的问题。谢谢! - iamjc015
1个回答

5

我不确定,但看起来你的类应该维护一个指向tokenStorage类的指针,而不是指向token本身的指针(因为token可能会变化)。你的服务应该是这样的:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接