2016-08-03 9 views
0

Symfonyでシリアライザが動作しています。私はEntityControllerでGETとPOST jsonを実行できます。既存のオブジェクト/エンティティを編集して保存できる編集フォームがあります。編集されたオブジェクトが(jsonオブジェクトとして)ポストされると、jsonオブジェクトはデシリアライズされ、永続化され、データベースにフラッシュされます。これまでのところ、少なくとも私が関連付けられた(ManyToMany)エンティティを投稿していない限り、とても良いです。Symfony2(非直列化):jsonとのエンティティ(関連付け)の更新

私は(多対多の関連で)2つのエンティティがあります。

  1. オブジェクト

  2. 要素

この作品を(コントローラでもjsonEditActionを参照してください(下記掲載) ):

{ 
    "id": "1", 
    "name": "object 1" 
} 

私の質問は:私はこのように、JSONに関連するエンティティとオブジェクトを編集するにはどうすればよい:

{ 
    "id": "1", 
    "name": "object 1", 
    "elements": { 
     "0": "1", 
     "1": "2" 
    } 
} 

私はsymfonyのから次の通知を取得する上記のJSON投稿時:

"メッセージ": "型\の予想引数" AppBundle \エンティティ\要素\ "\ "" 与えられた"、 "クラス" \整数: "のSymfony \コンポーネント\ PropertyAccess \例外の\ InvalidArgumentException"、

詳細については、

public function jsonEditAction(Request $request, $id) { 
    $serializer = $this->initSerializer(); 
    $em = $this->getDoctrine()->getManager(); 

    $object = $em->getRepository('AppBundle:Object')->findOneById($id); 

    $data = $request->getContent(); 

    $serializer->deserialize($data, 'AppBundle\Entity\Object', 'json', array('object_to_populate' => $object)); 

    try { 
     $em->persist($object); 
     $em->flush(); 

     $view = $this->view($object, 200) 
       ->setTemplate("object/json.html.twig"); 
    } catch (Exception $e) { 
     $view = $this->view('Caught exception: ' . $e->getMessage() . "\n", 500) 
       ->setTemplate("object/json.html.twig"); 
    } 

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

private function initSerializer() { 
    $encoders = array(new JsonEncoder()); 
    $normalizers = array(new ObjectNormalizer()); 

    $serializer = new Serializer($normalizers, $encoders); 

    return $serializer; 
} ` 

iは要素を持つ配列に歩いて、それらを一つずつ検索し、「オブジェクトの実体に追加する必要があります。これは、JSONはに投稿されeditActionのですか?または、私が見逃した/見なかったシリアライザの「ビルドイン」ソリューションがありますか?

UPDATE: また、JSONは動作しませんでしたアレクセイによって提案されたように:

{ 
    "id": 2, 
    "name": "Object 2c", 
    "elements": [{ 
     "id": 1 
    }, { 
     "id": 2 
    }] 
} 

UPDATE: 私の質問はの複製である: Deserialize an entity with a relationship with Symfony Serializer Component 作成したプル要求があるとSymfony 3.2でマージされます...

+0

Symfony [データトランスフォーマー](http://symfony.com/doc/current/form/data_transformers.html) – Jeet

+0

シリアライザが関係している限り、トランスフォーマを暗黙的に処理する必要があります[JMSSerializer](https://github.com/schmittjoh/JMSSerializerBundle)と[FOSRestBundle](http:// symfony。com/doc/current/bundles/FOSRestBundle/index.html)。しかし、私はそのような問題に直面しませんでした。なぜなら、データがクリーンなJSONで送信されていたとしても、私はポストデータを処理するために常にフォームタイプを使用していたからです。 – Jeet

+0

@Jeet:ハンドラの例を教えていただけますか? –

答えて

0

あなたは悪いJSONを持っています、Symfonyは同じことを言います。

良いJSONは次のようになります。

{ 
    "id": "1", 
    "name": "object 1", 
    "elements": [ 
     {"id": "254", "name": "element 254"}, 
     {"id": "301", "name": "element 301"} 
    ] 
} 

symfonyは元のJSONに"1""2"からElementオブジェクトをデシリアライズしようとすると失敗します。

+0

こんにちはAlexey、私は上記のようなjsonを投稿しましたが、私はまだ同じエラーが発生します –

関連する問題