У меня есть кэшированный сайт, на котором есть форма, которая не должна кэшироваться. Я использую 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
опубликовано кажется почтовое решение.
ESI является включением на стороне края, что означает, что не предназначен для обработки данных POST. По умолчанию обратные прокси, такие как Varnish или ядро Symfony HttpCache, рассматривают ESI как URL («/ _proxy? _Controller = x¶ms = и т. д.), которые они включают ПОЛУЧИТЬ его из вашего приложения. Вот почему вам трудно.
Однако ни один прокси-сервер не собирается кэшировать 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
Вы можете получить полные данные формы, используя
$data = $form->getData();
Или для отдельных полей:
$var = $form->get('yourformfieldname')->getData();
Остерегайтесь: это для Symfony> = 2.3, и вы получите две разные вещи:
объект со значениями, заполняемыми формой, если ваша форма имеет data-class
опция включена (поэтому она привязана к сущности); это будет исключать любое поле с 'mapping' => false
вариант
в противном случае массив со всеми полями формы