PHP-Symfony ESI获取FORM的POST参数,或者以POST形式调用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
如何从父请求中获取参数?
哈克解决方案
目前,我发现的唯一解决方案对我来说太过分了
枝条:
{{ 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& 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
标签:symfony,symfony-forms,esi,php 来源: https://codeday.me/bug/20191028/1954791.html