标签:symfony symfony-forms esi php
我有一个缓存的网站,里面有一个不应缓存的表格.我使用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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。