Php 尝试访问用户时,令牌为空

Php 尝试访问用户时,令牌为空,php,symfony,symfony-3.3,Php,Symfony,Symfony 3.3,我对Symfony 3中的令牌有一个奇怪的问题 我将security.token\u存储注入到我的一个分支扩展中 app.twig_extension: class: AppBundle\Twig\Extension\TwigExtension arguments: ['@security.token_storage'] tags: - { name: twig.extension } 现在,在构造函数中,我想从令牌中获取用户 public fu

我对Symfony 3中的令牌有一个奇怪的问题

我将
security.token\u存储
注入到我的一个分支扩展中

app.twig_extension:
     class: AppBundle\Twig\Extension\TwigExtension
     arguments: ['@security.token_storage']
     tags:
         - { name: twig.extension }
现在,在构造函数中,我想从令牌中获取用户

public function __construct(TokenStorage $tokenStorage)
{
    /** @var User user */
    $token = $tokenStorage->getToken();
    //$user = $token->getUser();
    //dump($user);
    //$this->user = $tokenStorage->getToken()->getUser();
}
问题就在这里。如果我转储
$token
,一切看起来都正常。以下是令牌的转储:

PostAuthenticationGuardToken {#637 ▼
  -providerKey: "main"
  -user: User {#396 ▶}
  -roles: array:1 [▶]
  -authenticated: true
  -attributes: []
}
但是如果我使用的是
$token->getUser()
我将在null上收到我正在调用的
getUser
错误

(1/1)fatalthrowable错误

在null上调用成员函数getUser()

此错误将显示在Symfony探查器中。现在,如果我要删除部件
$token->getUser()从我的代码,然后重新加载探查器,将显示用户

我也无法解释为什么会抛出关于null变量的错误。谁能给我解释一下吗


我已经尝试将整个容器注入服务器,并尝试通过容器获取用户,但结果是相同的。

尝试使用此方法获取用户

$user = $this->container->get('security.token_storage')->getToken()->getUser();

您在探查器上看到该错误的原因是探查器URL不在防火墙后面,因此getToken()没有身份验证信息且为null

PHPdoc for
getToken
函数

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

在调用
getToken()
之前,请确保检查身份验证信息是否可用。我无法解决问题本身,但我找到了一个解决方法

我没有将TokenStorage注入扩展,而是将用户作为我想要使用的函数的参数

这就是我在我的小树枝模板中所做的调用

{{ showUnreadMessages(app.user) }}
my TwigExtension包含以下函数:

public function getFunctions()
{
    return [
        new \Twig_SimpleFunction('showUnreadMessages', [$this, 'showUnreadMessages'])
    ];
}

public function showUnreadMessages(User $user)
{
    return $this->dbHandler->getCountUnreadMessages($user);
}

我在服役,没有集装箱。无论如何,不建议注入容器。您发布的代码与我的代码相同,唯一的区别是您正在检查容器,并且您必须拥有容器$token
是类PostAuthenticationGuardToken的对象,这就是为什么PostAuthenticationGuardToken显示在我在问题中发布的变量
$token
的转储中。我只想在有登录用户时接收用户。除了登录、注销外,所有内容都设置在防火墙后面。这不仅是一个探查器错误,还包括其他所有错误,例如,由于此错误,资产呈现失败。