Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
prog:symfony:extensions:jms-serializer [02/11/2019 14:56]
thierry [Utiliser des groupes]
prog:symfony:extensions:jms-serializer [11/09/2022 17:36] (Version actuelle)
thierry ↷ Page déplacée de prog:symfony:bundles:jms-serializer à prog:symfony:extensions:jms-serializer
Ligne 1: Ligne 1:
-====== jms/​serializer-bundle ======+====== ​Sérialisation avec jms/​serializer-bundle ======
 ===== Installation ===== ===== Installation =====
 <​code>​ <​code>​
Ligne 141: Ligne 141:
 On peut utiliser des groupes, voir l'​annotation ''​@Serializer\Groups({"​group1",​ "​group2"​})''​ On peut utiliser des groupes, voir l'​annotation ''​@Serializer\Groups({"​group1",​ "​group2"​})''​
 <note important>​Il ne faut pas utiliser les groupes en même temps que les annotation Exclude et Expose.</​note>​ <note important>​Il ne faut pas utiliser les groupes en même temps que les annotation Exclude et Expose.</​note>​
 +=== Annotations dans le fichier de l'​Entity ===
 +Pour chaque propertie on ajoute l'​Annotation ''​@Serializer\Groups({"​Groupes d'​appartenance"​})'' ​
 +<code php  [enable_line_numbers="​true",​highlight_lines_extra="​4,​15,​21,​27,​33,​39,​45,​51"​]>​
 +<?php
 +namespace App\Entity;
 +use Doctrine\ORM\Mapping as ORM;
 +use JMS\Serializer\Annotation as Serializer;
 +
 +/**
 + * @ORM\Entity(repositoryClass="​App\Repository\ProjectsRepository"​)
 + */
 +class Projects
 +{
 +    /**
 +     * @ORM\Id()
 +     * @ORM\GeneratedValue()
 +     * @ORM\Column(type="​integer"​)
 +     * @Serializer\Groups({"​all"​})
 +     */
 +    private $id;
 +
 +    /**
 +     * @ORM\Column(type="​string",​ length=40)
 +     * @Serializer\Groups({"​all"​})
 +     */
 +    private $name;
 +
 +    /**
 +     * @ORM\Column(type="​string",​ length=255)
 +     * @Serializer\Groups({"​all","​version"​})
 +     */
 +    private $url;
 +
 +    /**
 +     * @ORM\Column(type="​integer"​)
 +     * @Serializer\Groups({"​all","​version"​})
 +     */
 +    private $vmaj;
 +
 +    /**
 +     * @ORM\Column(type="​integer"​)
 +     * @Serializer\Groups({"​all","​version"​})
 +     */
 +    private $vmin;
 +
 +    /**
 +     * @ORM\Column(type="​integer"​)
 +     * @Serializer\Groups({"​all","​version"​})
 +     */
 +    private $revision;
 +
 +    /**
 +     * @ORM\Column(type="​integer"​)
 +     * @Serializer\Groups({"​all","​version"​})
 +     */
 +    private $construction;​
 +    ...
 +</​code>​
 +=== Modification du Controller ===
 +  - (ligne 5) On rajoute la clause ''​use JMS\Serializer\SerializationContext;''​
 +  - (ligne 15) On rajoute le paramétre : ''​SerializationContext::​create()->​setGroups(array('​version'​))''​ a l'​appel ''​$serializer->​serialize'',​ ou ''​version''​ est le nom du groupe que l'on veut voir sérialiser.
 +<code php  [enable_line_numbers="​true",​highlight_lines_extra="​5,​15"​]>​
 +<?php
 +namespace App\Controller;​
 +...
 +use JMS\Serializer\SerializerInterface;​
 +use JMS\Serializer\SerializationContext;​
 +...
 +class CheckVersionController extends AbstractController
 +{
 +    /**
 +     * @Route("/​api/​checkv/​{projName}",​ name="​api_checkVersion",​ methods={"​GET"​})
 +     */
 +    public function check(Request $request, SerializerInterface $serializer,​ string $projName)
 +    {
 +        $proj = $this->​getDoctrine()->​getRepository('​App:​Projects'​)->​findOneBy(['​name'​ => $projName]);​
 +        $data = $serializer->​serialize($proj,​ '​json',​SerializationContext::​create()->​setGroups(array('​version'​)));​
 +
 +</​code>​
 +==== Autres Annotations ====
 +  * [[http://​jmsyst.com/​libs/​serializer/​master/​reference/​annotations]]
 +
 +==== Utiliser les evenements ====
 +On  peut utiliser les evenements : 
 +  * **serializer.pre_serialize** : l'​évènement est de type  ''​JMS\Serializer\EventDispatcher\PreSerializeEvent''​ et permet de changer le type de l'​objet à sérialiser. Il est également possible d'​accéder aux données de l'​objet à sérialiser,​ ainsi qu'au visiteur (objet utilisé pour parcourir l'​objet à sérialiser). ​
 +  * **serializer.post_serialize** : l'​évènement est de type  ''​JMS\Serializer\EventDispatcher\ObjectEvent''​ et permet de modifier le résultat de la sérialisation de l'​objet.
 +  * **serializer.pre_deserialize** : l'​évènement est de type  ''​JMS\Serializer\EventDispatcher\PreDeserializeEvent''​ et permet de modifier les données soumises à l'​application et/ou modifier le type de l'​objet à obtenir après désérialisation.
 +  * **serializer.post_deserialize** : l'​évènement est de type  ''​JMS\Serializer\EventDispatcher\ObjectEvent''​ et permet de faire des manipulations sur l'​objet désérialisé comme de la validation ou ajouter des informations à l'​objet qui pourrait provenir d'un service (API) externe par exemple.
 +
 +
 +Plus d'​infos : [[https://​openclassrooms.com/​fr/​courses/​4087036-construisez-une-api-rest-avec-symfony/​4302366-allez-plus-loin-avec-jmsserializer#/​id/​r-4302459]]
 +==== Utiliser un Handler ====
 +C'est a dire créer un méthode qui sera appelée <<à la place>>​ de la méthode ''​serialize''​ ou ''​deserialize''​.\\
 +Ce qui laisse la maîtrise totale de la sérialisation ou dé-sérialisation...
 +
 +Plus d'​infos : [[https://​openclassrooms.com/​fr/​courses/​4087036-construisez-une-api-rest-avec-symfony/​4302366-allez-plus-loin-avec-jmsserializer#/​id/​r-4302489]]
 +====== Voir aussi ======
 +  * [[https://​symfony.com/​doc/​current/​serializer.html|Doc officielle sur le sérialiseur inclus dans Symfony]]
 +  * [[prog:​symfony:​bundles:​jms-serializer-bundle]]
 +
 +
 +
 +