2014-07-10 90 views
2

我有一個由RESTful Symfony應用程序支持的AngularJS應用程序。我對POST用戶有問題(例如POST /api/users/123)。

這裏是Symfony的形式在POST請求預計(編輯或提交資源):

{ 
    "user": { 
    "email":"[email protected]" 
    } 
} 

你在這裏看到的是正在被張貼對象在另一個user: {…}對象包裝(即代表形式)。

這裏是調用user.$save()角時的$資源將發佈什麼:

{ 
    "email":"[email protected]" 
} 

這裏沒有包裝。該對象直接發佈。

  • 哪一個是「正確的」,即RESTful?
  • 我該如何讓Symfony或Angular與其他工作(基於上一個答案)?

回答

0

以平穩方式創建資源的有效POST請求沒有ID。按照定義,你可以把一個ID放入。如果目標存在,則編輯該目標,否則將被創建。關於你的第一個問題,第二種形式會更「正確」。

基本上你定義了表單類型,所以它完全取決於你(沒有「它期望」)。一個例子可以是

class UserType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('email') 
     ; 
    } 

    public function getName() 
    { 
     return 'user_form'; 
    } 
} 

然後在你的控制器,你傳遞一個空的用戶實體

public function newAction() 
{ 
    $user = ...; 
    $form = $this->createForm(new UserType(), $user); 

    // ... 
} 

official book chapter約SF2形式爲多。

+0

嗨,我想我們不是在談論同樣的事情。兩種格式之間的差異不是關於ID,而是Symfony期望對象被包裝在另一個代表表單的對象(即'user:{...}')中,而Angular將直接發佈對象本身,而不包裝它。我已經更新了一下我的問題。 –

+0

現在我知道你的意思了,通常在輸入字段名前面加上的表單類型的名稱有問題。 – nietonfir

+0

是的,就是這樣! –

3

下面是我如何設法解決它,但如果它存在,我渴望得到更清潔的解決方案。

原來表單類型的名稱可以爲空:

class UserType extends AbstractType 
{ 
    // .. 

    public function getName() 
    { 
     return ''; 
    } 
} 

這使這是一個有效的提交:

{ 
    "email":"[email protected]" 
} 
+0

我認爲這是一個非常有效的解決方案。即使@BernhardSchussek推薦它(雖然[對於其他問題](http://stackoverflow.com/a/13474522/838733))。 – nietonfir

+0

感謝鏈接@nietonfir它也證實了我在代碼中讀到的內容(它似乎是一個有效的用例)。現在我會接受這個答案(當SO允許我的時候),並且如果有更好的選擇會彈出來,請切換。 –

+0

我深入瞭解代碼並提出了相同的解決方案,但認爲應該有更好的方法來做到這一點。你有沒有得到更好的解決方案? – vishal

0

據我知道你可以只提交的具體形式數據而不是整個陣列的形式名稱作爲一個關鍵像..

$form->submit($request->get($form->getName())); 
// or $request->request (for POST) 
// or $request->get (for GET) 
// to be more specific 

隨着這被稱爲那麼你就應該能夠使用..

$form->submit($request->all()); 
// again with ->request or ->get to be more specific 

..提交所有請求數據的實際形式的數據,而不需要表單名稱作爲關鍵。

這確實意味着任何額外的字段(如果有的話)都會被提交給表單,並可能導致其中一些「這個表單不應該包含額外的字段」。