2015-01-21 103 views
3

我有一個緩存的網站,它有一個不應該被緩存的形式。我使用ESI。提交表單時,我需要在我的控制器中獲取POST參數。 Symfony讓我得到Request Parameter'form'而不是真正的POST數據,或者有一個很好的方法來獲取它們。Symfony ESI獲取表單提交或調用ESI作爲POST 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 

如何我可以從父請求的參數?

哈克解決方案

目前我發現的唯一的解決辦法是對我來說太哈克
嫩枝:

{{ 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是邊緣側包括,這意味着它是設計爲處理髮布數據。默認情況下,像Varnish或Symfony的HttpCache內核這樣的反向代理服務器,通過從應用中獲取它,它們將包括爲的URL視爲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

+0

此外,大多數情況下,您可能不應該將發佈數據放入ESI中,這可能是敏感數據,可能會與您的母版頁一起緩存,也就是說,所有請求都會有效地「發佈」相同的數據,原因是你的破解不安全 – 2015-01-22 03:41:55

+0

沒有在ESI中發佈數據,你的意思是我的render_esi函數的調用與app.request ...?我想我不會需要這個時使用requestStack目前requestStack適用於我的Dev但似乎我的發佈請求被緩存在生產中,當我修復這個問題時似乎是一個很好的解決方案。 – 2015-01-22 07:57:57

1

可以使用

$data = $form->getData(); 

或者,對於單場得到完整的表單數據:

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

小心:這是對的Symfony> = 2.3,這將讓你兩種不同的東西:

  • 與形式填充值的實體,如果表單啓用了data-class選項(所以它的綁定對一個實體);這將排除任何字段與'mapping' => false選項

  • 否則,所有的表單的字段的陣列

+0

問題是,當不使用我可以通過設置表單數據的ESI組分:'$形式 - >的handleRequest($請求);'但當叫過來ESI我將只獲取參數中設定TWIG文件不是來自POST。 – 2015-01-21 11:40:15

+0

我確實看到了HttpFoundationRequestHandler中的handleRequest,只發現了一個hacky解決方案(在我的文章中添加)。 ESI請求更改爲GET,並將屬性設置爲symfony形式無法處理的GET屬性。我在我的文章中添加了一個hacky解決方案,但仍然在尋找更好的解決方案。唯一的問題似乎是ESI被稱爲GET而不是POST,所以參數被設置爲GET Params而不是POST數據:( – 2015-01-21 14:10:33

+0

你可以在表單中使用' - > setMethod('GET')'開始 – Jean 2015-01-22 09:16:34