2015-01-21 5 views
3

У меня есть сайт с кешем, который имеет форму, в которой не следует кэшировать. Я использую ESI для этого. Когда форма отправляется, мне нужно получить параметр POST в моем контроллере. Symfony позволил мне получить форму «Request Parameter», а не реальные данные POST, или есть хороший способ получить их.Symfony ESI получить POST Параметр для FORM отправьте или вызовите ESI как POST

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

Установка их на веточках не будет работать из-за родительской кэш-страницы.

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

Так как получить параметр поста в моем контроллере в настоящее время код, показанный здесь только получает мне данные ESI:

public function staticFormAction(Request $request) { 
    // .. 
    $form->handleRequest($request);// will not work because: 
    $request->get('firstName'); // is empty when called by ESI 

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

Hacky решение

В настоящее время единственное решение я нашел для меня слишком 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 на сообщение, так что мой вопрос знает «Как вызвать ESI как метод POST, а не GET? "

Решения

Использование requestStack как Chris Tickner публикуемых кажется после решения

ответ

3

ESI является ребром стороны включают, что означает, что не предназначен для обработки Данные POST. По умолчанию обратные прокси-серверы, такие как ядро ​​Varnish или Symfony HttpCache, видят ESI в качестве URL-адреса («/ _proxy? _controller = x & params = etc»), которые они включают, GET-ing из вашего приложения.Вот почему вы находите это трудным.

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

+0

Кроме того, по большей части, вы, вероятно, не должны помещать почтовые данные в ESI. Это могут быть конфиденциальные данные, которые могут быть кэшированы с вашей главной страницей. Смысл, все запросы будут эффективно «POSTING» теми же данными из-за твой хак. Небезопасно. –

+0

, не помещая данные в ESI, вы имеете в виду вызов моей функции render_esi с app.request ...? Думаю, мне это не понадобится при использовании requestStack. В настоящее время requestStack работает для меня на Dev но кажется, что мои почтовые запросы кэшируются на производстве, когда я получил это исправление, похоже, это хорошее решение. –

1

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

$data = $form->getData(); 

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

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

Берегитесь: это для Symfony> = 2.3, и это заставило бы вас две разные вещи:

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

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

+0

Проблема является компонентом ESI, когда он не используется, я могу установить данные формы по: '$ форма-> handleRequest ($ запроса);' но когда подозвал ESI я только получить набор параметров в TWIG файл не из POST. –

+0

Я посмотрел на handleRequest в HttpFoundationRequestHandler только нашел хакерское решение (добавлено в мой пост). Запрос ESI - это изменение в GET, и атрибуты устанавливаются как атрибуты GET, которые symfony формируют с помощью can not. Я добавил хакерское решение на свой пост, но все равно ищу лучшего решения. Единственные проблемы, по-видимому, в том, что ESI называется GET вместо POST, поэтому параметр устанавливается как GET Params не как POST Data :( –

+0

Вы можете использовать '-> setMethod ('GET')' в своей форме из start – Jean

 Смежные вопросы

  • Нет связанных вопросов^_^