La sérialisation de l'Entité Rapport avec l'Identifiant JMS Sérialiseur
Je suis en train de sérialiser une entité relation avec JMS Sérialiseur.
Ici est l'Entité:
class Ad
{
/**
* @Type("string")
* @Groups({"manage"})
*
* @var string
*/
private $description;
/**
* @Type("Acme\SearchBundle\Entity\Country")
* @Groups({"manage"})
*
* @var \Acme\SearchBundle\Entity\Country
*/
private $country;
/**
* @Type("string")
* @Groups({"manage"})
*
* @var string
*/
private $title;
/**
* Set description
*
* @param string $description
* @return Ad
*/
public function setDescription($description)
{
$this->description = $description;
return $this;
}
/**
* Get description
*
* @return string
*/
public function getDescription()
{
return $this->description;
}
/**
* Set country
*
* @param \Acme\SearchBundle\Entity\Country $country
* @return Ad
*/
public function setCountry($country)
{
$this->country= $country;
return $this;
}
/**
* Get country
*
* @return string
*/
public function getCountry()
{
return $this->country;
}
/**
* Set title
*
* @param string $title
* @return Ad
*/
public function setTituloanuncio($title)
{
$this->title = $title;
return $this;
}
/**
* Get title
*
* @return string
*/
public function getTitle()
{
return $this->title;
}
}
Et l'Entité de la relation:
class Country
{
/**
* @Type("string")
* @Groups("manage")
*
* @var string
*/
private $id;
/**
* @Type("string")
* @Groups("admin")
*
* @var string
*/
private $description;
/**
* Set description
* @Groups("")
*
* @param string $description
* @return Country
*/
public function setDescripcionpais($description)
{
$this->description = $description;
return $this;
}
/**
* Get description
*
* @return string
*/
public function getDescription()
{
return $this->description;
}
}
/**
* Get id
*
* @return string
*/
public function getId()
{
return $this->id;
}
}
Je sérialiser l'entité, mais je ne sais pas comment convertir le pays d'attribut dans un champ simple.
- Je obtenir ce résultat en json:
{"description":"foo", "title":"bar", "country":{"id":"en"} }
Mais je veux obtenir le champ id du pays, comme ceci:
{"description":"foo", "title":"bar", "country": "en" }
Il est possible avec JMS Sérialiseur?
Merci.
[MODIFIER]
@VirtualProperty ne fonctionne pas.
Vous devez vous connecter pour publier un commentaire.
Oui, vous pouvez utiliser
@VirtualProperty
annotation:Mais être conscient quand il s'agit de la désérialisation:
Espère que cela aide...
Juste pour suivre répondu à la question:
Si vous n'aimez pas écrire une méthode pour chaque relation que vous avez - il suffit d'écrire votre propre gestionnaire. C'est facile comme
Enregistrer le Gestionnaire
Cela vous permet de remplacer virtuel des méthodes de lecture avec "Type" ("Rapport").
Si vous aussi vous voulez pas de désérialiser de relation que vous devez dire à chaque
@Type("Relation")
la classe (@Type("Relation<FQCN>")
), à qui il doit désérialiser ou envelopper les métadonnées pilote avec qui le faire pour vous.select('entity', 'realtion')->leftJoin('entity.relation','relation')
générateur de requêtes ou de configurerEAGER
d'extraction à l'échelle mondiale pour la relationfunction __construct($skipVirtualTypeInit = false)
dansJMS/Serializer/SerializationContext.php
Je sais que cela a déjà été répondu, mais vous pouvez également utiliser @Accesseur.
C'est probablement ce qui (de mai, je ne peux pas être sûr) travail avec la désérialisation trop.
Vous pouvez utiliser
@Type
et@Accessor
annotations:L'auteur veut garder le nom de la propriété, qui ne s'applique pas à la accepté de répondre. Que j'ai compris, la réponse par ScayTrase de garder l'original du nom de la propriété, mais a un autre inconvénient selon les commentaires: L'objet sera récupérée si vous utilisez l'ORM Doctrine
@ManyToOne
, diminuant ainsi les performances.Si vous souhaitez conserver l'original du nom de la propriété, vous devez définir le
@VirtualProperty
au niveau de la classe et@Exclude
l'origine de la propriété. Sinon, le sérialisé nom de la propriété sera dérivée de la méthode de lecture (countryId
dans ce cas):Alternativement, vous pouvez
@inline
$country
qui va sérialiser ses propriétés dans la relation. Ensuite, vous pouvez@Expose
le Pays$id
et définir sa@SerializedName
à"country"
. À la différence des propriétés Virtuelles, à la fois de la sérialisation et la désérialisation de travail pour les propriétés.Pour que cela fonctionne, vous devez utiliser le
@ExclusionPolicy("All")
sur chaque classe et judicieusement@Expose
les propriétés que vous avez besoin dans l'un de vos groupes. C'est plus de sécurité la politique de toute façon.