我有一个缓存的网站,其中有一个形式,不应该缓存。我用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溶液
目前,我找到的唯一解决办法就是对我来说太笨拙了。
树枝:
{{ 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这样使用Chris Tickner似乎是post解决方案。
发布于 2015-01-22 03:39:00
ESI是一个边缘端的包含,这意味着它是而不是设计来处理POST数据。默认情况下,反向代理,如Varnish或Symfony的HttpCache内核,将ESI看作一个URL ("/_proxy?_controller=x¶ms=etc"),它们通过从应用程序获取包含的URL来包含它。这就是为什么你觉得这很难。
但是,没有代理将缓存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
发布于 2015-01-21 11:09:15
您可以使用以下方法获取完整的表单数据
$data = $form->getData();或者,对于单个字段:
$var = $form->get('yourformfieldname')->getData();注意:这是针对Symfony >= 2.3的,它会给您带来两种不同的东西:
data-class选项(因此它被绑定到一个实体);这将排除带有'mapping' => false选项的任何字段https://stackoverflow.com/questions/28065440
复制相似问题