我有一个缓存的网站,其中包含一个不应缓存的表单。我使用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似乎是后期解决方案。
答案 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
选项
否则,包含所有表单字段的数组