2016-05-15 85 views
0

它已經有幾天了,我正面臨Symfony奇怪的行爲。 我有一個行動,其中由於某種原因,我需要在會話中存儲隨機值作爲表單隨機數。 nonce被傳遞給樹枝模板以供ajax函數使用。Symfony2 |爲什麼控制器操作執行兩次

在向對應的操作發送nonce時,會檢查差異nonce值,因此請求會被拒絕。

測試顯示該操作由Symfony執行兩次,因此將存儲新的隨機數而不更新前端。我無法確定原因。

經過數百次測試後,我發現路線上的微小變化可以解決問題,但我不相信這是最終的解決方案,我找不到根本原因。

任何人都可以幫忙嗎?

這裏是有問題的代碼:

/** 
* 
* Condo Apartments management 
* 
* @Route("/condo/apartment") 
*/ 
class ApartmentController extends Controller 
{ 
    /** 
    * Index Condo Apartments 
    * 
    * @Route("/edit/{id}/{apartment}", name="edit_apartment") 
    * @Route("/manage/{id}", name="manage_apartments") 
    * @ParamConverter("apartment", class="RimakishCondominiumBundle:Apartment", options={"mapping":{"apartment"="id"}}) 
    * @Method({"GET", "POST"}) 
    */ 
    public function indexApartmentsAction(Request $request, Complex $complex, Apartment $apartment=null){ 


    $session = $request->getSession(); 
    $nonce = sha1(uniqid()); 
    if($session->has('nonce')){ 
     $session->remove('nonce'); 
    } 

    $session->set('nonce', $nonce); 

我只是改變了第一條路線如下,它的工作。現在我需要知道這個問題的根源。

* @Route("/{id}/{apartment}/edit", name="edit_apartment") 
+0

我正在使用Symfony 2.8 –

+1

最簡單的原因通常是正確的答案。看起來你的ajax函數可能會調用URL兩次。你應該調試完整的請求 - 這應該是非常明顯的,如果這個方法被通過ajax多次調用。 – Richard

+0

謝謝理查德,但那是我測試的一部分。我對服務器 - 客戶端通信進行了嚴格的監控,以確保沒有從瀏覽器發送到服務器的額外查詢。我也檢查了相同的服務器端的Doctrine查詢的數量。請記住,ajax調用另一個操作,我修改了Route來解決問題。如果ajax有問題,改變路線也無濟於事。 –

回答

0

我有一個類似的問題,前幾天,和理查德說,這個問題是我的應用程序的JS部分被發現。 在我的情況下,我使用on()jquery方法,因爲我的頁面中有動態內容,事件處理程序在某些特定情況下「積累」。 我不得不使用off()方法,這解決了我的多個ajax調用。

我的代碼如下所示:

// A function executed when clicking a button with class ".modal-form" 
$('body').on('click', '.modal-form', function (e) { 
    //...(loading a form in a modal) 
    //calling a function that initializes my form 
    initializeForm(); 
    //... 
}); 

解決我的問題,我不得不在我的功能initializeForm添加$("body").off("submit", "**");清除附着在單元所有事件處理程序ID爲「我型」

function initializeForm(){ 
    $("body").off("submit", "**"); // I had to add this to avoid sending multiple ajax 
             //requests in case the button with ".modal-form" 
             //class has been clicked several times 
    $('body').on('submit', '#my-form', function(e) { 
     //... 
     $.ajax({ 
      // That request was being sent several times 
      } 
     }); 
    }); 
} 
+0

謝謝Roubi,請查看我對Richard評論的評論 –

相關問題