You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Symfony测试场景下,已登录用户在Twig中app.user为null的问题求助

问题:Twig中app.user返回null,但控制器中已登录用户正常可用

我在Twig里使用app.user时碰到了个麻烦:测试单元里已经写了用户登录的逻辑,控制器里能正常拿到登录的用户,但Twig模板里访问app.user却一直返回null。下面是我测试中实现登录的代码:

$user = new User; 
$user->setRole('ROLE_ADMIN'); 
$user->setUsername('admin'); 
$firewallContext = 'main'; 
$token = new UsernamePasswordToken(serialize($user), null, $firewallContext, array('ROLE_ADMIN')); 
$session->set('_security_'.$firewallContext, serialize($token)); 
$session->save(); 
$cookie = new Cookie($session->getName(), $session->getId()); 
$this->client->getCookieJar()->set($cookie);
排查与解决方法

我帮你梳理几个可能的遗漏点,你可以逐一验证:

  • 别把User对象序列化后传给UsernamePasswordToken
    UsernamePasswordToken的第一个参数要求是User对象的实例,而不是序列化后的字符串。你现在传了serialize($user),这会让Symfony没法正确识别用户实体,Twig自然拿不到app.user。赶紧改成这样:

    $token = new UsernamePasswordToken($user, null, $firewallContext, array('ROLE_ADMIN'));
    
  • 用Symfony测试组件的loginUser方法替代手动操作
    手动处理session和cookie很容易出错,Symfony 4.3+的测试组件提供了loginUser方法,能自动帮你搞定所有登录相关的细节,比你手动写的代码靠谱多了。用法超简单:

    $this->client->loginUser($user);
    

    用这个方法的话,你之前写的那一大段session、cookie代码都可以删掉了。

  • 检查防火墙上下文名称是否匹配
    确认你代码里的$firewallContext = 'main'和security.yaml里配置的防火墙context值完全一致。如果名字对不上,Symfony找不到对应的安全token,app.user肯定是null。

  • 确保User类实现了正确的接口
    你的User类必须实现Symfony\Component\Security\Core\User\UserInterface接口,不然Symfony的安全组件没法正确处理这个用户对象,Twig也就识别不了app.user。

内容的提问来源于stack exchange,提问作者atcCoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:17:45