Symfony ESI 获取 POST FORM 提交参数或将 ESI 调用为 POST

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

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

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

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

{{ 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

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

Hacky 解决方案

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

{{ 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 方法而不得到?"

解决方案

Chris Tickner posted 一样使用 requestStack 似乎是 post 解决方案。

您可以使用

获取完整的表格数据
$data = $form->getData();

或者,对于单个字段:

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

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

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

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

ESI 是边缘端包含,这意味着它不是 旨在处理POST 数据。默认情况下,像 Varnish 或 Symfony 的 HttpCache 内核这样的反向代理,将 ESI 视为 URL ("/_proxy?_controller=x¶ms=etc") 它们通过 GET- include从您的应用程序中获取它。这就是为什么你觉得这很困难。

但是,没有代理会缓存 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