2016-03-08 35 views
2

我有一個服務,在其中注入TokenStorage並希望獲得curent用戶。在Symfony的kernel.request或kernel.request事件中獲取curent用戶

/** 
* 
* @Service("liip_theme.theme_request_listener") 
* @Tag("kernel.event_listener", attributes={ "event"="kernel.request", "method"="onKernelRequest" }) 
*/ 
class ThemeRequestListener 
{ 
    private $sam; 

    /** 
    * @InjectParams({ 
    *  "sam" = @Inject("security.token_storage") 
    * }) 
    */ 
    public function __construct(TokenStorage $sam) 
    { 

     $this->sam = $sam; 
    } 

    /** 
    * @param GetResponseEvent $event 
    */ 
    public function onKernelRequest(GetResponseEvent $event) 
    { 
     $a = $this->sam->getToken()->getUser(); 
    } 
} 

但是我卻越來越

Error: Call to a member function getUser() on null 

我沒有得到這個時候我var_dump($a),但是當我運行的網站通常也與此錯誤崩潰。我也刪除了緩存並重新啓動了apache。我也確定我已經登錄。var_dump() - 它的工作原理和檢索curent用戶,但沒有傾銷它,網站崩潰。

環顧四周,我發現它可能與聽者的優先級,但是我說:

* @Tag("kernel.event_listener", attributes={ "event"="kernel.request", "method"="onKernelRequest","priority"=0 }) 

而改爲0到-1,-255,255,1,什麼都沒有發生。

我做錯了什麼或是JMSDIExtraBundle的錯?

我也定義它像這樣:

liip_theme.theme_request_listener: 
    class: Application\Liip\ThemeBundle\EventListener\ThemeRequestListener 
    arguments: [ @security.token_storage ] 
    tags: 
     - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest, priority: 0 } 

所以它不是從JMSDI。

另一件事,它只在DEV環境中崩潰。我收到Symfony工具欄崩潰警報。在PROD中,它工作正常。但我仍然想解決它。

它不能是另一個包,因爲我已經嘗試了一個新的新的2.8.3項目,沒有供應商捆綁標準的,只是這個監聽器,並得到相同的錯誤。

打開GitHub問題here

+0

您有一個自定義數據收集器的分析器? –

+0

不是我自己製作的,但是我似乎發現只有那些是來自奏鳴曲集合的'sonata.block.data_collector'和'form.type_extension.form.data_collector'。 –

回答

2
$token = $this->sam->getToken(); 
$a = $token ? $token->getUser() : null; 

TokenStorage :: getToken可以返回null。

+1

用戶登錄時是否可以返回空值? –

+0

如果在安全偵聽器之前調用,或者另一個偵聽器設置爲null。 –

+1

那麼安全後我怎樣才能調用它?我需要知道里面的用戶,但它總是會返回null。 –

1

因爲沒有創建用戶對象,所以在內核之後調用防火牆服務。首先檢查令牌是否爲!= null,就像@ArturVesker所說的那樣。

相關問題