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

时间:2015-01-21 10:55:49

标签: php symfony symfony-forms esi

我有一个缓存的网站,其中包含一个不应缓存的表单。我使用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

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

Hacky解决方案

目前,我找到的唯一解决方案对我来说太苛刻了 TWIG:

{{ 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?&#34 ;

解决方案

使用像Chris Tickner这样的requestStack似乎是后期解决方案。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

您可以使用

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

或者,对于单个字段:

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

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

  • 如果您的表单启用了data-class选项,则表单填充了值的实体(因此它与实体绑定);这将使用'mapping' => false选项

  • 排除任何字段
  • 否则,包含所有表单字段的数组