从2.4开始,我们可以在服务中注入RequestStack
。
要检索当前Request
,有两种方法:
/** @var Request */
$request = $requestStack->getCurrentRequest();
// OR
/** @var Request */
$request = $requestStack->getMasterRequest();
我们何时应该使用currentRequest
?
我们什么时候应该使用masterRequest
?
例如,如果我需要检索当前Request
正文中的参数,我会使用:
$params = $request->request->all();
我应该使用哪两种方法?
答案 0 :(得分:2)
处理多个请求时,非主请求来自内部请求。通常来自树枝
{{ render(controller('foo')) }}
创建第二个请求时,只将请求格式和区域设置复制到新实例。因此,您希望来自用户的任何数据都将无法使用。这包括请求参数,IP地址和任何HTTP标头。
在大多数情况下,您只需要处理当前请求。但是,要回答您的问题,只要您需要来自用户的数据,您就需要主请求。一个示例是使用用户IP地址预先选择CountryType
表单控件。
使用getMasterRequest()->getClientIp()
时,您将获得用户的IP地址(类似于209.58.130.174)。在非主服务器上调用它时,您将获得localhost / loopback IP(127.0.0.1)。实际上没有任何方法可以返回null
,它们只返回有关如何创建请求的不同信息。
答案 1 :(得分:1)
主请求来自原始用户; subrequest是你在内部执行的 - 使用HttpKernel的forward()方法 - 或者通过框架的Controller类的forward()帮助程序 - 或者在Twig中使用{%render ...%}。 / p>
https://stackoverflow.com/a/12456998/1078488
这意味着如果您没有明确地想要用户提出实际请求,那么您通常会使用当前请求。
我已使用服务注入当前请求:
app.request:
class: Symfony\Component\HttpFoundation\RequestStack
factory:
- '@request_stack'
- 'getCurrentRequest'
然后你可以像这样注入它:
app.some_service:
class: AppBundle\Service\SomeService
arguments:
- '@app.request'
- '@some_other_service'