Symfony ESI получает параметр POST для отправки в FORM или вызывает ESI как POST

У меня есть кэшированный сайт, на котором есть форма, которая не должна кэшироваться. Я использую 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

Как я могу получить параметры из родительского запроса?

Хакерское решение

В настоящее время единственное решение, которое я нашел, это для меня слишком хакерский
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?«

Решение

Использование requestStack вроде Chris Tickner опубликовано кажется почтовое решение.

3

Решение

ESI является включением на стороне края, что означает, что не предназначен для обработки данных POST. По умолчанию обратные прокси, такие как Varnish или ядро ​​Symfony HttpCache, рассматривают ESI как URL («/ _proxy? _Controller = x&params = и т. д.), которые они включают ПОЛУЧИТЬ его из вашего приложения. Вот почему вам трудно.

Однако ни один прокси-сервер не собирается кэшировать 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

3

Другие решения

Вы можете получить полные данные формы, используя

$data = $form->getData();

Или для отдельных полей:

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

Остерегайтесь: это для Symfony> = 2.3, и вы получите две разные вещи:

  • объект со значениями, заполняемыми формой, если ваша форма имеет data-class опция включена (поэтому она привязана к сущности); это будет исключать любое поле с 'mapping' => false вариант

  • в противном случае массив со всеми полями формы

1

По вопросам рекламы [email protected]