Symfony ESI 获取 POST 参数用于表单提交或调用 ESI 作为 POST


Symfony ESI get POST Parameter for FORM submit or call ESI as POST

我有一个缓存的站点,其中有一个不应该缓存的表单。我使用 ESI 进行。提交表单后,我需要在控制器中获取 POST 参数。Symfony让我得到请求参数"表单"而不是真正的POST数据,或者有没有一个好方法来获取它们。

{{ render_esi(controller('MyBundle:Form:staticForm', {'form': 'sidebar'}))}}

由于父页面缓存,在树枝中设置它们将不起作用。

{{ render_esi(controller('MyBundle:Form:staticForm', {'form': 'sidebar', 'request': }))}}

那么如何在我的控制器中获取 post 参数,目前这里显示的代码只得到我的 ESI 数据:

public function staticFormAction(Request $request) {
    // ..
    $form->handleRequest($request);// will not work because:
    $request->get('firstName'); // is empty when called by ESI

如何从父请求中获取参数?

哈基解决方案

目前我找到的唯一解决方案对我来说太笨拙了
树枝:

{{ render_esi(controller('ClientWebsiteBundle:Form:staticForm', app.request.request.all|merge({'form': 'sidebar'}), app.request.query.all)) }}

.PHP:

$data = ($request->get('myFormName'));
if (count($data)) {
    // Forms uses $request->request
    $request->request->set('myFormName', $data);
    $request->setMethod('POST');
}

附加

经过一些研究并研究symfony核心代码,我需要将ESI更改为Post,所以我的问题是知道"如何将ESI称为POST方法而不是GET?

溶液

像发布Chris Tickner一样使用 requestStack 似乎是发布后的解决方案。

ESI 是一个边缘侧包含,这意味着它不是为处理 POST 数据而设计的。默认情况下,反向代理(如 Varnish 或 Symfony 的 HttpCache 内核)将 ESI 视为 URL("/_proxy?_controller=x&params=etc"),它们通过从您的应用程序中获取它来包含它。 正因为如此,你觉得这很困难。

但是,没有代理会缓存 POST 请求,因此您可以在 POST 请求期间使用 request_stack 服务访问主请求。

// if POST
$master_request = $this->get('request_stack')->getMasterRequest();
$form->handleRequest($master_request);

如果你使用的是Symfony HttpCache,这应该可以解决问题。

http://api.symfony.com/2.7/Symfony/Component/HttpFoundation/RequestStack.html

您可以使用

以下命令获取完整的表单数据

$data = $form->getData();

或者,对于单个字段:

$var = $form->get('yourformfieldname')->getData();

注意:这是针对Symfony>= 2.3的,它会给你带来两件不同的东西:

  • 具有由表单填充的值的实体(如果您的表单启用了"data-class"选项(因此它绑定到实体);这将排除具有"'mapping' => false"选项的任何字段

  • 否则,包含所有表单字段的数组