フォームを使用して、ajaxを介してapiメソッドにエンティティデータを処理しています。
私の型クラス:
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add(
$builder->create('basicdata', 'form', array('virtual' => true))
->add('firstname', null, array('required' => true))
->add('lastname', null, array('required' => true))
);
$builder->add('contactdetails', new ContactdetailsType());
$builder->add('medialinks', new MedialinksType());
}
ご覧のとおり、フォームを3つのセクションに分けています。1つはbasedataで、2つはcontactdetailsとmedialinksを保持するための追加のエンティティです。
私のJavaScriptでは、作成ボタンに次のリスナーがあります。
$('#player_form_create').on('click', function(e){
e.preventDefault();
$.ajax({
type: "POST",
url: remotePathPlayerCreate,
data: $('.form').serialize()
});
});
chromes開発者ツールによると、POSTデータは次のようになります。
player_form[basicdata][firstname]:Harvey
player_form[basicdata][lastname]:Specter
player_form[contactdetails][email]:[email protected]
player_form[medialinks][website]: http://
私のAPIアクションでは、リクエストを処理して新しいプレーヤーレコードを保存したいと思います。
public function cpostAction()
{
$player = new Player();
$form = $this->createForm(new PlayersType(), $player);
$form->handleRequest($this->getRequest());
if($form->isValid()){
$em = $this->getDoctrine()->getManager();
$em->persist($player);
$em->persist($player->getContactdetails());
$em->persist($player->getMedialinks());
$em->flush();
return $this->redirectView(
$this->generateUrl(
'get_player',
array('id' => $player->getId())
),
Codes::HTTP_CREATED
);
}
return array(
'processedForm' => $form
);
}
あなたがすでに知っているかもしれないように、私が要求を処理したい間に問題が起こります。$this->getRequest()
リクエストハンドラーに必要な形式のPOSTデータ情報が含まれていないと思います。
このようなデータを投稿すると、500が表示されExpected argument of type \"Symfony\\Component\\HttpFoundation\\Request\", \"array\" given
ます。
POSTデータがリクエストオブジェクトとして送信されるようにするにはどうすればよいですか?
解決策を見つけました:submit()関数を使用$form->submit
してフォーム送信を処理する方法のページによると、配列データをフォームに送信するために使用しています。
$form->submit($this->getRequest()->request->get($form->getName()));
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加