我有一个缓存的站点,其中有一个不应该缓存的表单。我使用 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
如何从父请求中获取参数?
哈基解决方案
目前我找到的唯一解决方案对我来说太笨拙了
树枝:
{{ 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?
溶液
像发布Chris Tickner
一样使用 requestStack 似乎是发布后的解决方案。
ESI 是一个边缘侧包含,这意味着它不是为处理 POST 数据而设计的。默认情况下,反向代理(如 Varnish 或 Symfony 的 HttpCache 内核)将 ESI 视为 URL("/_proxy?_controller=x¶ms=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
以下命令获取完整的表单数据
$data = $form->getData();
或者,对于单个字段:
$var = $form->get('yourformfieldname')->getData();
注意:这是针对Symfony>= 2.3的,它会给你带来两件不同的东西:
具有由表单填充的值的实体(如果您的表单启用了"
data-class
"选项(因此它绑定到实体);这将排除具有"'mapping' => false
"选项的任何字段否则,包含所有表单字段的数组