2016-10-13 1 views
1

Une entité est donnée avec ces propriétés:JMSSerializer, sérialisation des valeurs d'entité paire à (clé, valeur) dans l'objet JSON

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

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

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

Le contrôleur ressemble à ceci:

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

Mon front-end attend un format JSON comme ceci:

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

Mon projet est beaucoup plus complexe, mais cela est une description minified du problème. Ma seule préoccupation est comment puis-je formater les propriétés dans une paire clé-valeur dans un objet json. Puis-je y parvenir en utilisant les annotations?


Si non, alors comment?

EDIT

Entité de traduction a une relation ManyToOne avec les langues Entité:

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

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

Répondre

1

Mon erreur, je pensais que je ne l'ai pas besoin de mentionner que cette entité a une relation ManyToOne avec un autre. Mais @Matteo a indiqué la bonne direction. Avec une petite configuration de son code, j'ai réussi à faire fonctionner ça.

Travailler avec un objet $obj = new \StdClass; dans le suivant getWhateva() n'a pas fonctionné du tout. Je n'ai pas essayé dans le contrôleur cependant. La configuration est la suivante:

Ajouter à languages.php:

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

et contrôleur:

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

Sortie:

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

bonne prise! Acceptez votre réponse pour que la question soit aussi résolue – Matteo

1

Vos exigences ne sont pas si standard pour être mis en œuvre dans une bibliothèque standard: vous voulez une collection d'objets sera traduit en un seul objet et répertorié en tant qu'attribut avec la valeur (en tant que données de transposition Json).

Vous pouvez archiver votre objectif avec une implémentation personnalisée comme suit:

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

Hope this aide