2014-07-18 16 views
5

我目前正在嘗試讓symfony表單與我的文章一起工作,並把其餘的API端點。如何獲取Symfony表單以使用REST API?

目前我有:

$request = $this->getRequest(); 
$cc = new CreditCard(); 
$form = $this->createForm(new CreditCardType(), $cc); 

$form->handleRequest($request); 

if ($form->isValid()) { 
    //... 
} 

然而,形式永遠有效。研究這個問題,似乎表單的isSubmitted字段是錯誤的,所以它永遠不會通過驗證。另外,由於這是api調用,因此我在信用卡類型中將csrf_protection設置爲false。

下面是我在用戶提交哪些數據的例子:

{ 
    "credit_card": { 
    "name" : "Example Name" 
    ... 
    } 
} 

我如何提交給註冊這個帖子/放置請求,並有形式驗證通過?謝謝。

回答

5

如果您可以提供CreditCardType類的整個代碼以及表單中的完整POST數據和驗證錯誤,這將會很有幫助。

反正這是事情我發現是表單提交失敗的原因:

  • 提交不完整的數據:如果你有你的CerditCardType窗體上的字段是你的POST請求缺席,確保它有'required'選項設置爲false。
  • 表單名稱:確保您的所有字段都使用以您的表單名稱(您在CreditCardType :: getName()方法中提供的名稱)命名的屬性進行包裝。在你的情況下,我認爲這是「credit_card」。
  • 只發布您的CreditCardType類中定義的字段。如果您發佈的參數與表單的任何字段都不匹配,您將會收到驗證錯誤,如「此表單不應該有任何額外字段」或類似的內容。

無論如何,如果您提供更多信息,我很樂意提供更多幫助。

UPDATE:

好吧,我覺得你的問題是你要發送的數據作爲JSON字符串和handleRequest()方法沒有得到任何數據,因爲Symfony的不知道應該從請求的解碼(它期望數據以$ _GET或$ _POST參數的形式發送)。所以你必須自己做。

而不是使用handleRequest()方法必須由請求的內容($request->getContent())解碼使用submit()方法與數據,你獲得的:

$request = $this->getRequest(); 
$cc = new CreditCard(); 
$form = $this->createForm(new CreditCardType(), $cc); 

// Decode de JSON input 
$data = json_decode($request->getContent(), true); 

// Post the data to the form 
$form->submit($data); 

if ($form->isValid()) { 
    //... 
} 

希望它現在幫助!

順便說一句,如果你正在使用RESTful實現,你應該考慮使用FOSRestBundle包。它會處理所有的格式轉換邏輯以及路由,實體de /序列化等。

+0

正如我剛纔所說,表單的提交價值是假的。我在symfony的Form類中的提交函數中放了一個die語句,並且死亡從未被觸發。另外提交函數是symfony中唯一一個提交爲true的集合。 CreditCardType與您期望的添加字段的構建器完全相同,getName返回'credit_card',data_class設置爲creditcard enity。 –

+0

@DerickF很抱歉。我用isValid()困惑了isSubmitted()。你是否將數據發佈爲JSON字符串?如果您需要解析您的請求內容以解碼de JSON,然後將該對象用作表單數據。讓我知道如果是這樣的話,我可以用正確的答案編輯我的帖子! –

+0

精美的作品!謝謝! –

5

您的數據沒有正確傳遞到窗體,因爲您傳遞的請求對象沒有表單名稱作爲鍵。

當使用的Symfony創建表單創建它以下類型的陣列,當POST ING ..

"your_form_name": {   // Given that you forms `getName()` 
          // returns "your_form_name" 
    "field1": "value1", 
    "field2": "value2" 
} 

當您使用handleRequest方法使用它的形式名稱作爲像下面的鍵(see github爲完整的代碼)..

if ('GET' === $method) { 
     if ('' === $name) { 
      $data = $_GET; 
     } else { 
      // Don't submit GET requests if the form's name does not exist 
      // in the request 
      if (!isset($_GET[$name])) { 
       return; 
      } 

      $data = $_GET[$name]; 
     } 
    } else { 
     // ... same sort of stuff for $_POST, $_FILES, etc 
    } 

    // ... 

    $form->submit($data, 'PATCH' !== $method); 

這意味着,如果提交不包含窗體名稱則它不會提交一個數組。

得到解決,這將是使用submit()方法來代替,並提交所有的數據,而不是與窗體名稱鍵像數據的方式..

$form->submit($request->request->all()); // $_POST 

$form->submit($request->query->all());  // $_GET 
+0

my $ form-> getName()返回'credit_card',我試着按照你指定的方式傳遞數據(沒有外部大括號),我仍然沒有任何運氣。 –

+0

沒有外部支撐? – qooplmao

+0

看到我的問題和我給的示例數據。我刪除了外面的「{}」 –

相關問題