2012-10-31 65 views
1

我正在使用FOSRestbundle實現rest API。現在說的POST請求我得到的請求參數選擇不當,如:表單綁定不綁定請求在Symfony 2.1中形成+ FOSRestBundle

Symfony\Component\HttpFoundation\ParameterBag Object 
(
    [parameters:protected] => Array 
     (
      [rank] => 12 
      [city] => 1345 
      [comment]=> 'safd' 
     ) 

) 

我的後作用的代碼是:

/** 
* @Rest\View 
*/ 
public function newAction(){ 

    $rank= new Rank();  
    $form = $this->createForm(new RankType(), $rank); 
    $form->bind($this->getRequest()); 
    if ($form->isValid()) { 
     //. $user->flush(); 

     $em = $this->getDoctrine()->getManager(); 
     $em->persist($rank); 
     $em->flush(); 
     $response = new Response(); 
     $response->setStatusCode($statusCode); 
     $view = View::create() 
     ->setData($rank) 
     ->setFormat('json'); 

     return $this->handleView($view); 
    } 

    return $this->handleView(View::create($form, 400)); 
} 

form->isValid失敗,因爲設置空值形成。

After Binding form form->getData() will display : 


MyProject\DataBundle\Entity\Rank Object 
(
    [city:MyProject\DataBundle\Entity\Ranking:private] => 
    [rank:MyProject\DataBundle\Entity\Ranking:private] => 
    [comment:MyProject\DataBundle\Entity\Ranking:private] => 
) 

RankType代碼:

class RankType extends AbstractType 
{ 
    /** 
    * {@inheritdoc} 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('rank'); 
     $builder->add('city'); 
     $builder->add('comment'); 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class'  => 'Myporject\DataBundle\Entity\rank', 
      'csrf_protection' => false, 
     )); 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function getName() 
    { 
     return 'rank'; 
    } 
} 

驗證將拋出喜歡的城市,排名誤差不能爲空

任何建議,爲什麼不$form->bind結合值?

+0

發表您的表單類RankType()請。 –

+0

我加了RankType() – stefun

回答

12

我認爲,我剛剛解決了我的應用程序相同的問題:)

看看你的形式:getName()方法返回「排名」 - 這是形式的名稱,這是這個表單數據的命名空間:) Symfony2將使用它來綁定。

所以,當你將數據發送這樣的:

array('rank'=> 'somevalue', 'city' => 'comecityname', 'comment' => 'somecomment')

它不會工作,因爲綁定方法將搜索下「排名」命名空間放置數據的陣列,並會找到字符串「someValue中」 。表單數據將保持爲空。

數據的更改格式是:

array('rank' => array('rank'=> 'somevalue', 'city' => 'comecityname', 'comment' => 'somecomment')) 

與REST發送 - 那麼它應該工作

我希望這將有助於

+0

我有同樣的問題,就像你在回答中描述的一樣,但是我的門檻有同樣的問題。任何進一步調試的建議? – wowpatrick

+0

我做了同樣的建議,並在這裏提到; http://pedrogilcandeias.wordpress.com/2013/01/15/symfony2-rest-gotcha-unable-to-bind-a-request/但仍然輸出相同。表單和請求不受限制。 – Geshan

+0

這對我有用: $ jsonData = json_decode($ request-> getContent(),true); //「true」來獲得關聯數組 –