在Symfony中获取kernel.request或kernel.request事件中的当前用户

时间:2016-03-08 08:50:52

标签: php symfony

我有一个服务,我在其中注入TokenStorage并希望获得该用户。

/**
 *
 * @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() - 它可以工作并检索当前用户,但没有转储它,网站崩溃了。

环顾四周,我发现它可能与听众优先级有关,但我已添加:

* @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

2 个答案:

答案 0 :(得分:2)

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

TokenStorage :: getToken可以返回null。

答案 1 :(得分:1)

防火墙服务在内核之后被调用,因为没有创建用户对象。首先检查Token是否为!= null,就像@ArturVesker所说的那样。