2014-02-25 41 views
2

我讀過這篇文章(http://welcometothebundle.com/symfony2-rest-api-the-best-2013-way/),用Symfony2構建我的系統REST API。遵循指南,我不再使用Symfony2 Form作爲Web表單,但只有2個主要工作:將數據映射到實體驗證。在我看來,我使用AngularJS在其良好的內置服務的幫助下調用REST API。Symfony2 Form + AngularJS for REST API =表單驗證額外字段錯誤

在我的情況下,我想更新我的實體,AngularJS將獲得從實體序列化的JSON數據,並設置回$ scope.object綁定到表單。例如:

{ 
    email: "[email protected]" 
    id: 22 
    party: { 
     id:24, 
     lastName: Gates, 
     firstName: Bill 
    } 
} 

使一些變化,然後送$ scope.object更新與PUT方法的路線,我將使用Symfony2的表單並提交該數據,但Symfony2的表單驗證保持引發異常這種形式不應含有多餘的領域。。我知道ID字段不是表單字段,但不知道如何使Symfony忽略所有這些額外的字段。你可以幫我嗎?

+0

形式PARAM名稱不匹配JSON的字段名。 Symfony表單通常有myform [email] myform [id]。所以表單處理程序不會捕獲正確的字段名稱,而是將它們放到額外的字段中。順便說一句,我正在一個在AngularJS + Symfony2之上開發的組織中工作。在我們的應用中,當我們想要POST/some_url時,我們使用JMSSerializerBundle提供的JSON反序列化。你可以看看:) – Marco

回答

4

如果id字段不是表單字段,那麼你可以添加到您的形式,而是將其添加爲一個非映射字段(即它不涉及到對實體屬性):

$builder->add('id', 'hidden', array('mapped' => false)); 
+0

我正在尋找一些東西來忽略在這裏提到的額外的https://github.com/symfony/symfony/issues/7209。但是,也許你們是目前解決這個問題的唯一方法。非常感謝你! –

1

解決辦法有兩個:

  1. 您可以撤消該領域id和你的數據數組傳遞給窗體之前修改請求數據,所以它適合你的方式。你的情況我認爲它必須是:

    $data = $request->request->all(); // get all posted data 
    unset($data['id']); 
    $data['party'] = $data['party']['id']; 
    
    $form->submit($data); 
    
  2. 您可以將字段添加到您的表單類型,或者表單生成器並設置mapped - 選項來false,使Symfony的不嘗試將其映射到你的實體。像@JamesHallall已經提到。

2

從Symfony的版本2.6你可以用新的形式選項allow_extra_fieldsaccepted pull request)。 2.6鬆開2014分之11is planned但你已經可以使用它(在composer.json):在Symfony的形式給出

"symfony/symfony": "2.6.*@dev" 
+0

這是個好消息,upvoting。在不久的將來,這將是最好的答案。 –

+0

使用開發版本從來不會令人鼓舞,但是,現在應該可以在2.7中使用。 – tomazahlin