Symfony 6功能测试无法获取会话值的问题求助
Symfony 6功能测试中注入会话值的正确方式
在Symfony 5升级到6后,测试中手动往request_stack推入带会话的请求无效,原因是调用$client->request()时会生成全新的Request对象并覆盖栈顶请求,且手动创建的会话未与客户端Cookie绑定,导致新请求无法复用会话数据。以下是两种可行的解决方法:
方法一:直接操作客户端会话并绑定Cookie
这是最推荐的方式,利用测试客户端的会话机制自动关联请求:
protected function setUp(): void { self::ensureKernelShutdown(); $this->client = $this->createClient([]); // 获取客户端容器中的会话对象 $this->session = $this->client->getContainer()->get('session'); $this->session->start(); // 启动会话生成ID $this->session->set('myvalue', 'foo'); // 设置会话值 $this->session->save(); // 持久化会话数据 // 将会话Cookie添加到客户端CookieJar,后续请求自动携带 $sessionCookie = new Cookie($this->session->getName(), $this->session->getId()); $this->client->getCookieJar()->set($sessionCookie); } public function testFoo() { $this->client->loginUser($user); // 发起请求,会话值会自动通过Cookie传递 $this->client->request('GET', '/myurl/'); // 后续可断言服务是否正确获取到会话值 }
方法二:请求时手动携带会话Cookie
如果需要更灵活地控制请求头,可在request()方法中直接传入会话Cookie:
public function testFoo() { $this->client->loginUser($user); $session = $this->client->getContainer()->get('session'); $session->start(); $session->set('myvalue', 'foo'); $session->save(); // 构造Cookie头并发起请求 $this->client->request( 'GET', '/myurl/', [], [], [ 'Cookie' => sprintf('%s=%s', $session->getName(), $session->getId()) ] ); }
关键注意事项
- 必须调用
$session->start():未启动的会话不会生成唯一ID,Cookie无法关联有效会话 - 必须调用
$session->save():会话数据需要持久化到存储(测试环境默认用内存存储),否则后续请求无法读取 - 避免手动操作
request_stack:Symfony 6测试客户端会在每次request()时自动生成并管理请求对象,手动推入的请求会被覆盖
内容的提问来源于stack exchange,提问作者TikTaZ
相关产品推荐
相关产品推荐

