2016-10-13 5 views
1

アンエンティティは、これらの特性が付与されたJSONオブジェクトに(キー、値)ペアにエンティティ値をシリアライズ:JMSSerializer、

class DefaultController extends { 
    public function indexAction(Request $request) { 
     $translation = $this->getDoctrine()->getRepository('AppBundle:Translation')->findAll(); 
     $serializer = SerializerBuilder::create()->build(); 
     $translationJson = $serializer->serialize($translation, 'json'); 

     return new Response($translationJson); 
    }  
} 

マイフロントエンド:

class Translation 
{ 
    /** 
    * @var string 
    * @SerializedName("language_code") 
    */ 
    private $lang; 

    /** 
    * @var string 
    * @SerializedName("text") 
    */ 
    private $translation; 

    /** 
    * @var int 
    */ 
    private $language_id; 
} 

コントローラは、このようになります

{ 
    "en" : "yes", 
    "de" : "ja", 
    "it" : "si" 
} 

私のプロジェクトははるかに複雑ですが、これは問題の詳細な説明です。私の唯一の関心事は、プロパティをjsonオブジェクトのキーと値のペアにどのようにフォーマットすることができるかです。

注釈を使用してこれを達成できますか?
そうでなければ、どうですか?

class Languages 
{ 
    /** 
    * @var int 
    */ 
    private $id; 

    /** 
    * @var int 
    * @ORM\OneToMany(targetEntity="Translation", mappedBy="translation_id", cascade={"persist"}, orphanRemoval=true) 
    */ 
    private $translations; 
} 

答えて

1

私のミス、私はこのエンティティが持つManyToOne関係を持っていることを言及する必要はないと思いました別のしかし、@マッテオは正しい方向を指していた。彼のコードの小さな構成で、私はこれを動作させることができました。

$obj = new \StdClass;のオブジェクトの操作は、getWhateva()ではまったく動作しませんでした。私はコントローラでそれを試していない。 configが以下の通りである。languages.phpをに追加

/** 
* @VirtualProperty 
* @SerializedName("whateva") 
*/ 
public function getWhateva() { 
    $arr = array(); 
    foreach ($this-> translation as $elem) { 
     $arr[$elem-> getLang()] = $elem->getTranslation(); 
    } 
    return $arr; 
} 

とコントローラでは:

$langu = $this->getDoctrine()->getRepository('AppBundle:Language')->findAll(); 
    $languageJson = $serializer->serialize($language, 'json'); 

出力:

"whateva": { 
     "en" : "yes", 
     "de" : "ja", 
     "it" : "si" 
} 
+0

良いキャッチ!あなたの答えを受け入れるようにしてください。 – Matteo

1

あなたの要件は、標準ライブラリに実装されるので、標準ではありません:

EDIT

翻訳エンティティが言語エンティティとManyToOne関係を持っているあなたは、オブジェクトのコレクションがなりたいです単一のオブジェクトに変換され、値付きの属性として(Json転置データとして)リストされます。

あなたは次のようにカスタム実装であなたの目的をアーカイブすることができます

public function indexAction(Request $request) { 
     $translation = $this->getDoctrine()->getRepository('AppBundle:Translation')->findAll(); 

     $obj = new \StdClass; 

     foreach ($translation as $elem) 
     { 
      // transform each value in an attribute/value of the single object 
      $obj->{$elem->getLang()} = $elem->getTranslation(); 
     } 

     return new JsonResponse($obj); 
    }  

・ホープ、このヘルプ

関連する問題