私は Symfony2 と多くのバンドルを初めて使用しますが、プロトタイプ REST API に取り組んでおり、FOSRestBundle を使用し、Symfony2 によって生成されたネイティブ CRUD も試しています。ただし、Symfony2 CRUD コードは正しい JSON 形式の応答を返しますが、POST はエラーを返し、問題の解決方法に関する説明とチュートリアルを探しています。エンティティの GET と POST の両方のコードを見てください。この場合はアドレスとしましょう。
/**
* Lists all Address entities.
*
* @Route("/", name="address")
* @Method("GET")
* @Template()
*/
public function indexAction()
{
$em = $this->getDoctrine()->getManager();
$entities = $em->getRepository('MyWebServicesBundle:Address')->findAll();
return array(
'entities' => $entities,
);
}
/**
* Creates a new Address entity.
*
* @Route("/", name="address_create")
* @Method("POST")
* @Template("MyWebServicesBundle:Address:new.html.twig")
*/
public function createAction(Request $request)
{
$entity = new Address();
$form = $this->createCreateForm($entity);
$form->handleRequest($request);
// Inserted new code for deserialization
$entity->setUseruid($request->request->get("useruid"));
$entity->setCity($request->request->get("city"));
$entity->setLatitude($request->request->get("latitude"));
$entity->setLongitude($request->request->get("longitude"));
$serializer = JMS\Serializer\SerializerBuilder::create()->build();
$entity = $serializer->deserialize($request->request->all(), 'Name\BundleName\Entity\Address', 'json');
if ($form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($entity);
$em->flush();
return $this->redirect($this->generateUrl('address_show', array('id' => $entity->getId())));
}
return array(
'entity' => $entity,
'form' => $form->createView(),
);
}
AJAX を使用して API にリクエストを送信しているとします。ここに、GET と POST の両方のコードをそれぞれ示します。
$.ajax({
dataType: "json",
type: "GET",
url: "/symfony/web/app_dev.php/address/",
success: function (responseText)
{
alert("Request was successful, data received: " + responseText);
},
error: function (error) {
alert(JSON.stringify(error));
}
});
$.ajax({
dataType: "json",
type: "POST",
data: {"id":1,"useruid":"Nothing","type":"Office in Space","latitude":"74.3","longitude":"33.2","displayed":true,"public":true,"verified":true,"street":"Something","city":"Something","country":"Space","region":"North America","created":"2009-03-07T00:00:00-0500","delete_status":"active"},
url: "/symfony/web/app_dev.php/address/",
success: function (responseText)
{
console.log("Request was successful, data received: " + JSON.stringify(responseText));
},
error: function (error) {
alert(JSON.stringify(error));
}
});
GET は正しいものを返しますが、POST は次のエラーを返します: {"code":500,"message":"Warning: json_encode(): recursion detected in /var/www/projects/symfony/vendor/jms/serializer/src/ JMS/Serializer/JsonSerializationVisitor.php 行 29"}。エラーを解決するにはどうすればよいですか? 単一のエンティティまたはすべてのエンティティを返すことができますが、パスにデータを送信してエンティティを作成するだけの POST でエラーが発生します。JMSSerializer バンドルを 0.12.* から dev-master に更新し、AJAX によって送信されるデータに NULL 値が含まれていないことを確認しましたが、エラーは残ります。POST コントローラーに POST で送信された有効な JSON からデータを作成させるにはどうすればよいですか?
PUT も試してみましたが、結果は同じで、リソースは更新されません。テーブル内のレコードを更新するだけではいけませんか? このバグの原因を突き止めるためにさらに情報を提供する必要がある場合はお知らせください。コードは上記で編集されています。