首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Symfony ESI获取表单提交或调用ESI作为POST的POST参数

Symfony ESI获取表单提交或调用ESI作为POST的POST参数
EN

Stack Overflow用户
提问于 2015-01-21 10:55:49
回答 2查看 1.4K关注 0票数 3

我有一个缓存的网站,其中有一个形式,不应该缓存。我用ESI做的。当表单提交时,我需要在我的控制器中获得POST参数。Symfony让我得到请求参数“表单”,而不是真正的POST数据,或者有一个很好的方法来获取它们。

代码语言:javascript
复制
{{ render_esi(controller('MyBundle:Form:staticForm', {'form': 'sidebar'}))}}

将它们设置在树枝中将无法工作,因为父页面缓存。

代码语言:javascript
复制
{{ render_esi(controller('MyBundle:Form:staticForm', {'form': 'sidebar', 'request': }))}}

因此,如何在我的控制器中获得post参数,目前这里显示的代码只获取ESI数据:

代码语言:javascript
复制
public function staticFormAction(Request $request) {
    // ..
    $form->handleRequest($request);// will not work because:
    $request->get('firstName'); // is empty when called by ESI

如何从父请求中获取参数?

Hacky溶液

目前,我找到的唯一解决办法就是对我来说太笨拙了。

树枝:

代码语言:javascript
复制
{{ render_esi(controller('ClientWebsiteBundle:Form:staticForm', app.request.request.all|merge({'form': 'sidebar'}), app.request.query.all)) }}

PHP:

代码语言:javascript
复制
$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解决方案。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-22 03:39:00

ESI是一个边缘端的包含,这意味着它是而不是设计来处理POST数据。默认情况下,反向代理,如Varnish或Symfony的HttpCache内核,将ESI看作一个URL ("/_proxy?_controller=x¶ms=etc"),它们通过从应用程序获取包含的URL来包含它。这就是为什么你觉得这很难。

但是,没有代理将缓存POST请求,因此您可以在POST请求期间使用request_stack服务访问主请求。

代码语言:javascript
复制
// 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

票数 3
EN

Stack Overflow用户

发布于 2015-01-21 11:09:15

您可以使用以下方法获取完整的表单数据

代码语言:javascript
复制
$data = $form->getData();

或者,对于单个字段:

代码语言:javascript
复制
$var = $form->get('yourformfieldname')->getData();

注意:这是针对Symfony >= 2.3的,它会给您带来两种不同的东西:

  • 具有表单填充值的实体,如果窗体启用了data-class选项(因此它被绑定到一个实体);这将排除带有'mapping' => false选项的任何字段
  • 否则,一个包含窗体所有字段的数组
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28065440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档