我对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();
,我会收到一条错误,我在 null
getUser
(1/1)FatalThrowableError
在null
上调用成员函数getUser()
此错误将显示在Symfony分析器中。现在,如果我从代码中删除部件$token->getUser();
,然后重新加载探查器,则会显示该用户。
我无法解释这种行为,也不能解释为什么抛出有关 null 变量的错误。有人可以向我解释一下吗?
我已经尝试将整个容器注入服务器并试图让用户通过容器,但结果是一样的。
答案 0 :(得分:1)
您在Profiler上看到错误的原因是探查器URL不在防火墙后面,因此getToken()没有身份验证信息且为null。
finally { ... }
函数的PHPdoc
getToken
确保在致电/**
* Returns the current security token.
*
* @return TokenInterface|null A TokenInterface instance or null if no authentication information is available
*/
public function getToken();
答案 1 :(得分: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);
}
答案 2 :(得分:-1)
尝试使用此功能来获取用户
$user = $this->container->get('security.token_storage')->getToken()->getUser();