gpt4 book ai didi

php - Symfony ESI 获取 FORM 提交的 POST 参数或调用 ESI 作为 POST

转载 作者:可可西里 更新时间:2023-11-01 01:00:41 26 4
gpt4 key购买 nike

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

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

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

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

那么目前如何在我的 Controller 中获取 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,所以我的问题是“How to call ESI as POST method not 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

关于php - Symfony ESI 获取 FORM 提交的 POST 参数或调用 ESI 作为 POST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28065440/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com