Symfony功能测试问题:从容器获取服务时当前请求未设置
解决Symfony功能测试中RequestStack无当前请求的问题
我太懂这种踩坑的感觉了!你遇到的问题核心原因是:Symfony的RequestStack只有在实际发起HTTP请求后,才会把请求对象存入栈中——哪怕你创建客户端时指定了HTTP_HOST,只要没触发真实请求,容器里的RequestStack还是空的,依赖它的服务自然会抛出「当前请求未设置」的错误。
给你两种针对性的解决方案:
方案一:手动推入Request对象(无需发起真实请求)
如果只是想单独测试服务逻辑,不想走完整的HTTP请求流程,可以手动构造一个Request并推入RequestStack:
// 获取测试容器 $container = static::getContainer(); // 构造带指定HTTP_HOST的Request对象(路径随便填,我们只需要host参数) $request = \Symfony\Component\HttpFoundation\Request::create( '/', 'GET', [], [], [], ['HTTP_HOST' => 'test.' . $this->domain] ); // 把Request推入RequestStack $requestStack = $container->get(\Symfony\Component\HttpFoundation\RequestStack::class); $requestStack->push($request); // 现在再获取你的服务,就能正常读取HTTP_HOST了 $yourService = $container->get(YourService::class);
方案二:先发起HTTP请求再获取服务
如果你的测试本来就需要发起HTTP请求,那只要调整顺序,先调用客户端的request()方法,再从容器拿服务:
// 创建带host配置的客户端 $client = static::createClient([], ['HTTP_HOST' => 'test.' . $this->domain]); // 先发起任意请求(比如GET首页),触发RequestStack填充 $client->request('GET', '/'); // 现在从容器获取服务,就能拿到正确的currentRequest了 $yourService = static::getContainer()->get(YourService::class);
简单总结就是:RequestStack不会提前预填充请求对象,必须有实际请求触发,或者手动推入构造好的请求,你的服务才能拿到它依赖的currentRequest。
内容的提问来源于stack exchange,提问作者Jeroen
相关产品推荐
相关产品推荐

