2017-07-11 63 views
0

我有一个奇怪的问题,在Symfony的令牌用户3令牌当试图访问

我注入security.token_storage到我的一个枝杈伸展现在

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();我会收到我的

(1/1)FatalThrowableError

调用 getUser错误

调用成员函数getUser()null

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

我不能解释这种行为,也不能解释为什么会抛出有关变量的错误。有人可以向我解释这个吗?

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

回答

-1

尝试使用这个,而不是让用户

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

我的服务我,没有容器。无论如何不建议注入容器。您发布的代码与我的代码相同,唯一的区别是您要检查容器,并且必须具有容器。 – KhorneHoly

+0

然后可能'PostAuthenticationGuardToken-> getUser();' – Arcv

+0

对不起,但我认为你并没有真正理解我所问的问题。变量'$ token'是类** PostAuthenticationGuardToken **的对象,这就是为什么** PostAuthenticationGuardToken **显示在我发布在我的问题中的变量'$ token'的转储中。 – KhorneHoly

0

你看到的分析器,错误的原因是探查网址是不是在防火墙后面,以便为gettoken()没有身份验证信息,为空。

的PHPDoc的为getToken功能

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

请务必检查认证信息,请您致电getToken()

+0

我只想在有登录用户的情况下接收用户。除登录之外的所有内容,注销都设置在防火墙后面。这不仅是一个探查器错误,而且还包括其他一切由于此错误,资产呈现失败。 – KhorneHoly

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