2015-01-21 104 views
3

我有一个缓存的网站,它有一个不应该被缓存的形式。我使用ESI。提交表单时,我需要在我的控制器中获取POST参数。 Symfony让我得到Request Parameter'form'而不是真正的POST数据,或者有一个很好的方法来获取它们。Symfony ESI获取表单提交或调用ESI作为POST POST参数

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

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

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

因此,如何能在这个控制器后参数目前这里显示的代码只让我的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更改为发布,所以我的问题是知道“如何调用ESI作为POST方法不GET?

解决方案

使用requestStack像Chris Tickner发布似乎后的溶液

回答

3

ESI是边缘侧包括,这意味着它是设计为处理发布数据。默认情况下,像Varnish或Symfony的HttpCache内核这样的反向代理服务器,通过从应用中获取它,它们将包括为的URL视为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

+0

此外,大多数情况下,您可能不应该将发布数据放入ESI中,这可能是敏感数据,可能会与您的母版页一起缓存,也就是说,所有请求都会有效地“发布”相同的数据,原因是你的破解不安全 – 2015-01-22 03:41:55

+0

没有在ESI中发布数据,你的意思是我的render_esi函数的调用与app.request ...?我想我不会需要这个时使用requestStack目前requestStack适用于我的Dev但似乎我的发布请求被缓存在生产中,当我修复这个问题时似乎是一个很好的解决方案。 – 2015-01-22 07:57:57

1

可以使用

$data = $form->getData(); 

或者,对于单场得到完整的表单数据:

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

小心:这是对的Symfony> = 2.3,这将让你两种不同的东西:

  • 与形式填充值的实体,如果表单启用了data-class选项(所以它的绑定对一个实体);这将排除任何字段与'mapping' => false选项

  • 否则,所有的表单的字段的阵列

+0

问题是,当不使用我可以通过设置表单数据的ESI组分:'$形式 - >的handleRequest($请求);'但当叫过来ESI我将只获取参数中设定TWIG文件不是来自POST。 – 2015-01-21 11:40:15

+0

我确实看到了HttpFoundationRequestHandler中的handleRequest,只发现了一个hacky解决方案(在我的文章中添加)。 ESI请求更改为GET,并将属性设置为symfony形式无法处理的GET属性。我在我的文章中添加了一个hacky解决方案,但仍然在寻找更好的解决方案。唯一的问题似乎是ESI被称为GET而不是POST,所以参数被设置为GET Params而不是POST数据:( – 2015-01-21 14:10:33

+0

你可以在表单中使用' - > setMethod('GET')'开始 – Jean 2015-01-22 09:16:34