RequestStack什么时候应该使用getMasterRequest而不是getCurrentRequest?

时间:2016-03-25 11:11:02

标签: php http symfony

2.4开始,我们可以在服务中注入RequestStack

要检索当前Request,有两种方法:

/** @var Request */
$request = $requestStack->getCurrentRequest();

// OR

/** @var Request */
$request = $requestStack->getMasterRequest();

我们何时应该使用currentRequest
我们什么时候应该使用masterRequest

例如,如果我需要检索当前Request正文中的参数,我会使用:

$params = $request->request->all();

我应该使用哪两种方法?

2 个答案:

答案 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'