0

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

我将其注入security.token_storage到我的 Twig 扩展中

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();我会收到一个错误,我正在getUser调用null

(1/1) FatalThrowableError

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

此错误将显示在 Symfony 分析器中。现在,如果我$token->getUser();从代码中删除该部分,然后重新加载分析器,则会显示用户。

我无法解释这种行为,也无法解释为什么会引发有关null变量的错误。有人可以向我解释一下吗?

我已经尝试将整个容器注入服务器并尝试让用户通过容器,但结果是一样的。

4

3 回答 3

1

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

getToken函数的 PHPdoc

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

确保在致电之前检查身份验证信息是否可用getToken()

于 2017-07-11T16:32:02.243 回答
0

我无法解决问题本身,但我找到了一个可行的解决方法。

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

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

{{ showUnreadMessages(app.user) }}

我的 TwigExtension 包含以下功能:

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

public function showUnreadMessages(User $user)
{
    return $this->dbHandler->getCountUnreadMessages($user);
}
于 2017-07-12T08:48:01.487 回答
-1

尝试使用它来获取用户

$user = $this->container->get('security.token_storage')->getToken()->getUser();
于 2017-07-11T15:33:51.163 回答