2013-10-09 45 views
1

我有一個控制器操作,它遍歷實體數組併爲每個創建一個表格 ,然後將它們呈現在樹枝模板中,如下所示:表單上的csrf_protection導致「無法啓動會話」錯誤

public function siteTestAction() { 
    $api = $this->get('product_model'); 
    $result = $api->findProductByCode("2000082"); 

    $array_forms = Array(); 

    foreach ($result as $prod) 
    { 
     $form = $this->createForm('pos_product', $prod, array('action' => $this->generateUrl('receive_form'))); 
     $array_forms[] = $form->createView(); 

    } 

    return $this->render('AEBikePOSSyncBundle:Default:array_form.html.twig', array(
     'data' => $array_forms, 
    )); 
} 

加載該錯誤會給我一個錯誤「無法啓動會話,因爲標頭已由第0行的」「發送。」

此控制器操作是重新編寫完美工作的不同操作。我試圖消除它們之間的差異,但有很多,例如新的使用Guzzle來消費API。幾乎所有的差異都在findProductsByCode()方法的後面,它只返回實體數組。

在堆棧跟蹤的最後三個項目是:

  • NativeSessionStorage - >開始()
  • 在會話 - >啓動()
  • 在SessionCsrfProvider - > getSessionId()

所以我開始尋找csrf_protection。只要我禁用FormType類中的csrf_protection,錯誤就會消失,一切正常。

原來的工作行爲是否使用csrf_protection,我可以通過查看錶單源和查看令牌字段來驗證。

那麼,爲什麼csrf_protection會在一個動作中導致這個錯誤,而不是另一個動作,使用相同的FormType?

**編輯:我在兩條路線之間消除了儘可能多的差異,唯一不同的是我使用Guzzle下載API並使用cURL。我想我將不得不通過Guzzle文件查看額外的空格或編碼錯誤?

**編輯2: 嗯,我縮小了範圍,找到了罪魁禍首,但我不知道該怎麼做。我使用Guzzle來使用API​​,而我的Guzzle類有一個Listener,它會在每次發送請求時設置一些狀態變量。此代碼位於我的Guzzle類構造函數中:

$this->getEventDispatcher()->addListener('request.complete', function(Event $event) { 

     $this->status_code = (int) $event['response']->getStatusCode(); 
     $this->reason_phrase = $event['response']->getReasonPhrase();; 
     $this->url = $event['request']->getUrl(); 

    }); 

如果我刪除該塊,則一切正常。 那麼現在的問題,爲什麼?我當然想保留這個聽衆。

+0

是否有一個特定的原因,你不想使用[集合字段類型]呈現多個產品編輯表單(http://symfony.com/doc/current/參考/形式/類型/ collection.html)? – nifr

+0

你確定這是一個錯誤,因爲csrf_token?通常這是在session_start();之前寫入內容時引起的。由於您正在開發一個symfony項目,因此您不會手動調用「session_start();」,所以在生成錯誤字符的文件之間可能存在編碼問題!如果您的項目採用UTF8編碼,請檢查涉及此操作的文件,它們可能編碼爲ANSI ...就像將另一個項目中的文件複製到當前文件一樣。但這只是一個比喻性的,不一定是解決方案^^ – Sybio

+0

@Sybio我不確定這是因爲csrf_token(因爲令牌在同一個FormType的不同路由中成功使用),但切換該設置確實會消除錯誤。我一直在尋找無關空間或編碼錯誤的文件。 – Nelluk

回答

0

呃,我發現了一個錯誤的flush();聲明在我的代碼深處。絕對不是在尋找那個。這麼多紅鯡魚在這個...

相關問題