2017-07-16 1 views
0

J'ai configuré Symfony 3 pour sérialiser automatiquement mon action. Il fonctionne, mais les relations ne sont pas sérialisé:FOSRestBundle n'utilise pas JMSSerializerBundle

0 
    id 1 
    name "Liste de course" 
    creation_date "2017-07-07T00:00:00+00:00" 
    last_update_date "2017-07-07T20:57:06+00:00" 
    user_entity 
    _todo_entity_entities 
    _parent_entity 
1 
    id 2 
    name "domotique" 
    creation_date "2017-07-07T00:00:00+00:00" 
    last_update_date "2017-07-07T21:22:52+00:00" 
    user_entity 
    _todo_entity_entities 
    _parent_entity 

Si j'utilise explicitement JMSSerializerBundle, il fonctionne (user_entity est un objet):

0 
    id 1 
    name "Liste de course" 
    creation_date "2017-07-07T00:00:00+00:00" 
    last_update_date "2017-07-07T20:57:06+00:00" 
    user_entity Object 
    _todo_entity_entities 
1 
    id 2 
    name "domotique" 
    creation_date "2017-07-07T00:00:00+00:00" 
    last_update_date "2017-07-07T21:22:52+00:00" 
    user_entity Object 
    _todo_entity_entities 

Je pense que FOSRestBundle utilise le seralizer par défaut, non JMSSerializerBundle :

/** 
* @Rest\Get("/projects") 
* @View(
* serializerGroups = {"all"} 
*) 
*/ 
public function getProjectsAction() 
{ 
    $projectEntity = $this->getDoctrine()->getRepository('todoListAdminBundle:Project'); 
    $projects = $projectEntity->findAll(); 
    /* 
    $data = $this->get('jms_serializer')->serialize($projects, 'json'); 
    // this is work ! 
    $response = new Response($data); 
    $response->headers->set('Content-Type', 'application/json'); 
    return $response; 
    */ 

    return $projects; 
} 

L'entité I sérialisation:

/** 
* Project 
* 
* @ORM\Table(name="project") 
*    @ORM\Entity(repositoryClass="todoListAdminBundle\Repository\ProjectRepository") 
*/ 
class Project 
{ 
/** 
* @var int 
* 
* @ORM\Column(name="id", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
    * @Serializer\Groups({"all"}) 
*/ 
private $id; 

/** 
* @var string 
* 
* @ORM\Column(name="name", type="string", length=255) 
    * @Assert\Length(max=50) 
    * @Assert\Type(type="string") 
    * @Serializer\Groups({"all"}) 
*/ 
private $name; 

/** 
* @var \DateTime 
* 
* @ORM\Column(name="creation_date", type="date") 
    * @Assert\DateTime() 
    * @Serializer\Groups({"all"}) 
*/ 
private $creationDate; 

/** 
* @var \DateTime 
* 
* @ORM\Column(name="last_update_date", type="datetime") 
    * @Assert\DateTime() 
    * @Serializer\Groups({"all"}) 
*/ 
private $lastUpdateDate; 

/** 
* 
* @ORM\ManyToOne(targetEntity="PW\UserBundle\Entity\User", inversedBy="projectEntities" , cascade={"persist"}, inversedBy="projectEntities") 
    * @Assert\Type(type="integer") 
    * @Serializer\Groups({"all"}) 
*/ 
private $userEntity; 

/** 
* @ORM\OneToMany(targetEntity="todoListAdminBundle\Entity\TodoEntity", mappedBy="projectEntity", fetch="EAGER") 
* @Serializer\Groups({"all"}) 
*/ 
private $TodoEntityEntities; 

/** 
* @var int 
* 
* @ORM\JoinColumn(nullable=true, referencedColumnName="id") 
* @ORM\OneToOne(targetEntity="todoListAdminBundle\Entity\Project") 
* @Assert\Type(type="integer") 
* @Serializer\Groups({"all"}) 
*/ 
private $ParentEntity; 

Ma configuration:

fos_rest: 
    param_fetcher_listener: true 
    body_listener: true 
    zone: 
     - { path: ^/api/* } 
    body_converter: 
     enabled: true 
    view: 
     formats: { json: true, xml: false, rss: false } 
     view_response_listener: true 
    serializer: 
     serialize_null: true 
    format_listener: 
     enabled: true 
     rules: 
      - { path: '^/api', priorities: ['json'], fallback_format: 'json' } 
    routing_loader: 
     default_format: json 

sensio_framework_extra: 
    view: { annotations: true } 

Comment puis-je utiliser JMSSerializerBundle automatiquement?

Répondre

0

Tout d'abord, vous devez configurer JMSSerializer dans vos config.yml comme:

jms_serializer: 
    metadata: 
     cache: file 
     debug: "%kernel.debug%" 
     file_cache: 
      dir: "%kernel.cache_dir%/serializer" 
     auto_detection: true 

Ensuite, créer le répertoire avec sérialiseur pour l'entité donnée YourBundleName/Ressources/config/sérialiseur/Entity.Project.yml avec ce code:

YourBundleName\Entity\Project: 
    exclusion_policy: ALL 
    properties: 
     id: 
      expose: true 
     name: 
      expose: true 

"exclusion_policy: ALL" - exclut tous les champs du résultat sérialisé. Et puis vous ajoutez les champs nécessaires avec "expos: true". N'ajoutez pas "ParentEntity" là et vous ne le verrez pas dans les données sérialisées (aussi, je ne pense pas, ce mélange de chameau et de pascal est une bonne pratique, mais c'est la question du goût).