1

FOSRestbundleを使用してRESTAPIを実装しています。ここで、POSTリクエストについて、次のようなリクエストパラメータを適切に取得していると言います。

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、フォームにnull値を設定したために失敗します。

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] => 
)   

ランクタイプコード:

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';
    }
}

検証は都市のようなエラーをスローし、ランクはnullであってはなりません

$form->bind値をバインドしない理由はありますか?

4

1 に答える 1

12

私は自分のアプリで同じ問題を解決したと思います:)

フォームを見てください:getName()メソッドは'rank'を返します-これはフォームの名前であり、これはこのフォームデータの名前空間です:)Symfony2はそれを使用してバインドします。

したがって、次のようなデータを送信する場合:

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

bindメソッドは「rank」名前空間の下に配置されたデータの配列を検索し、文字列「somevalue」を見つけるため、機能しません。フォームデータは空のままになります。

データの形式を次のように変更します。

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

そしてそれをRESTで送信します-そうすれば動作するはずです

これがお役に立てば幸いです

于 2012-11-14T08:57:31.007 に答える