1

Je développe un service RESTful avec Symfony2, JMS Serializer Bundle, FOS Rest Bundle et Hateoas Bundle. Il y a 2 entités User et Company et je veux, quand je sérialise une compagnie obtenir plus de détails. Toutefois, lors de la sérialisation, la société associée à l'utilisateur affiche uniquement l'ID de la société et l'objet de nom ou uniquement l'ID en tant qu'entier.JMS Serializer sérialiser l'objet dans l'objet avec une vue différente

J'ai une politique de sérialisation comme ci-dessous.

utilisateur

Acme\UserBundle\Entity\User: 
exclusion_policy: ALL 
xml_root_name: user 
properties: 
    id: 
     expose: true 
     type: integer 
    company: 
     expose: true 
     type: Acme\CompanyBundle\Entity\Company 
    name: 
     expose: true 
     type: string 
    surname: 
     expose: true 
     type: string 
    picture: 
     expose: true 
     type: string 
relations: 
    - 
     rel: self 
     href: 
      route: acme_v1_get_user 
      parameters: 
       id: expr(object.getId()) 
      absolute: true 

Société

Acme\CompanyBundle\Entity\Company: 
exclusion_policy: ALL 
xml_root_name: company 
properties: 
    id: 
     expose: true 
     type: integer 
    name: 
     expose: true 
     type: string 
    address: 
     expose: true 
     type: string 
    phone: 
     expose: true 
     type: string 
    web: 
     expose: true 
     type: string 
    created_date: 
     expose: true 
     type: DateTime 
    updated_date: 
     expose: true 
     type: DateTime 
    status: 
     expose: true 
     type: integer 
relations: 
    - 
     rel: self 
     href: 
      route: acme_v1_get_company 
      parameters: 
       id: expr(object.getId()) 
      absolute: true 

de sortie prévue

{ 
    "id": 1, 
    "name": "Jenny", 
    "surname": "Doe", 
    "picture": "http://google.com/kittens.jpg", 
    "info": [], 
    "company": { 
    "id": 1, 
    "name": "Demo Company" 
    } 
} 

OU

{ 
    "id": 1, 
    "name": "Jenny", 
    "surname": "Doe", 
    "picture": "http://google.com/kittens.jpg", 
    "info": [], 
    "company": 1 
} 

Ce que je suis

{ 
    "id": 1, 
    "name": "Jenny", 
    "surname": "Doe", 
    "picture": "http://google.com/kittens.jpg", 
    "info": [], 
    "company": { 
    "id": 1, 
    "name": "Demo Company", 
    "address": "Lorem ipsum dolor sit amet", 
    "phone": "0902124440444", 
    "web": "http://www.demo-company.com", 
    "created_date": "2015-07-22T11:21:03+0300", 
    "updated_date": "2015-07-24T01:50:39+0300", 
    "status": 1 
    } 
} 

Répondre

2

Vous pouvez utiliser des groupes

AppBundle\Entity\User\User: 
    exclusion_policy: ALL 
    properties: 
     lastname: 
      expose: true 
      groups: [info] 

Et avec une annotation, vous pouvez définir la propriété est affiché sur quel groupe. Et enfin, vous pouvez assigner un groupe à chaque route que vous utilisez.

Ou vous pouvez utiliser les propriétés virtuelles comme ceci:

AppBundle\Entity\User\User: 
    exclusion_policy: ALL 
    properties: 
     […] 
    virtual_properties: 
     getCompanyId: 
      serialized_name: company 
      type: string 
      groups: [info] 

Et vous créez une méthode getCompanyId() dans votre entité utilisateur, qui renvoie le COMPANYID

+0

Merci, groupant travail pour moi. Je fais un groupe par défaut qui est pour afficher chaque processus de sérialisation et un groupe lié à la sérialisation par exemple. Groupe d'utilisateurs pour la sérialisation du contrôleur d'utilisateur ou Groupe d'entreprise pour le contrôleur d'entreprise. De cette façon, lorsque je sérialise à partir du groupe d'entreprise activant l'entreprise afin d'obtenir tous les détails, mais à partir d'une autre sérialisation liée à l'entreprise ne montre que les groupes par défaut. Y a-t-il une meilleure façon de le faire ou est-ce une façon courante de le faire? –

+0

Je ne fais que commencer par la sérialisation, donc je ne sais pas s'il y a une meilleure façon de faire, mais c'est comme ça que je le ferais – Hakim

0

Plus Hateoas façon de le faire serait la rapports.

Acme\UserBundle\Entity\User: 
exclusion_policy: ALL 
xml_root_name: user 
properties: 
    id: 
     expose: true 
     type: integer 
    name: 
     expose: true 
     type: string 
    surname: 
     expose: true 
     type: string 
    picture: 
     expose: true 
     type: string 
relations: 
    - 
     rel: self 
     href: 
      route: acme_v1_get_user 
      parameters: 
       id: expr(object.getId()) 
      absolute: true 
    - 
     rel: company 
     href: 
      route: acme_v1_get_company 
      parameters: 
       id: expr(object.getCompany().getId()) 
      absolute: true 

céderais ...

{ 
    "id": 1, 
    "name": "Jenny", 
    "surname": "Doe", 
    "picture": "http://google.com/kittens.jpg", 
    "info": [] 
    "_links": { 
    "self": { 
     "href": "http://server.com/api/user/1" 
    }, 
    "company": { 
     "href": "http://server.com/api/company/1" 
    }, 
    } 
}