我有一个服务,我在其中注入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。
答案 0 :(得分:2)
$token = $this->sam->getToken();
$a = $token ? $token->getUser() : null;
TokenStorage :: getToken可以返回null。
答案 1 :(得分:1)
防火墙服务在内核之后被调用,因为没有创建用户对象。首先检查Token是否为!= null,就像@ArturVesker所说的那样。