编程语言
首页 > 编程语言> > PHP-Symfony ESI获取FORM的POST参数,或者以POST形式调用ESI

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