3

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

{{ render_esi(controller('MyBundle:Form:staticForm', {'form': 'sidebar'}))}}

由于父页面缓存,将它们设置在 twig 中将不起作用。

{{ 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
TWIG:

{{ 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似乎是发布解决方案。

4

2 回答 2

3

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

于 2015-01-22T03:39:00.527 回答
1

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

$data = $form->getData();

或者,对于单个字段:

$var = $form->get('yourformfieldname')->getData();

注意:这是 Symfony >= 2.3 的版本,它会给你带来两个不同的东西:

  • 具有由表单填充的值的实体,如果您的表单data-class启用了该选项(因此它绑定到实体);这将排除'mapping' => false带有该选项的任何字段

  • 否则,一个包含所有表单字段的数组

于 2015-01-21T11:09:15.123 回答