Partage
  • Partager sur Facebook
  • Partager sur Twitter

Symfony 4 : Serializer - Name converter

    17 juillet 2019 à 12:59:32

    Bonjour à tous, 

    Je travaille actuellement sur un projet dans lequel je dois récupérer des flux rss en xml, les lire et enregistrer les données dans ma base de données dans un entité déjà existante.

    Je m'explique avec un peu de code :

    J'ai une entitée Advert contenant les champs suivants :

    class Advert
    {
        /**
         * @ORM\Id()
         * @ORM\GeneratedValue()
         * @ORM\Column(type="integer")
         */
        private $id;
    
        /**
         * @ORM\Column(type="boolean")
         */
        private $isActive;
    
        /**
         * @ORM\Column(type="datetime")
         */
        private $postedAt;
    
        /**
         * @ORM\Column(type="datetime")
         */
        private $expiredAt;
    
        /**
         * @ORM\Column(type="string", length=190)
         */
        private $position;
    
        /**
         * @ORM\Column(type="string", length=190)
         */
        private $city;
    
        /**
         * @ORM\Column(type="string", length=190)
         */
        private $postalCode;
    
        /**
         * @ORM\Column(type="string", length=190)
         */
        private $salary;
    
        /**
         * @ORM\Column(type="string", length=190, nullable=true)
         */
        private $duration;
    
        /**
         * @ORM\Column(type="string", length=190)
         */
        private $experience;
    
        /**
         * @ORM\Column(type="string", length=190)
         */
        private $training;
    
        /**
         * @ORM\Column(type="text")
         */
        private $missions;
    
        /**
         * @ORM\Column(type="text")
         */
        private $talents;
    
        /**
         * @ORM\Column(type="boolean")
         */
        private $handicapped;
    
        /**
         * @ORM\Column(type="datetime")
         */
        private $startAt;
    
        /**
         * @ORM\Column(type="array")
         */
        private $languages = [];
    
        /**
         * @ORM\Column(type="text")
         */
        private $description;

    J'ai créé un service me permettant de lire le fichier xml que je récupère en utilisant les outils HttpClient et Serializer de Symfony :

    class SerializeXMLFilesService
    {
        public function serializeXML($url)
        {
            $httpClient = HttpClient::create();
            $response = $httpClient->request('GET', $url);
            $content = $response->getContent();
    
            $encoder = new XmlEncoder();
            $normalizer = new ObjectNormalizer();
            
            // Crée un tableau associatif
            $xml_decoded = $encoder->decode($content, 'xml');
            
            // Ce que je n'arrive pas à faire :
            // Faire correspondre les champs du tableau associatif récupéré avec ceux de mon entité
            
            // Normalise les données
            $xml_normalized = $normalizer->denormalize($xml_decoded, Advert::class);
    
            return $xml_normalized;
        }
    }

    Comme je vous le mets dans le code ci_dessus, il y'a une étape que je n'arrive pas à faire c'est faire correspondre les champs du tableau que je reçois avec les champs de mon entité.

    J'ai vu qu'il existait un composant du Serializer le NameConverter qui pourrait fonctionner, seulement je vais récupérer des flux de différents sites dont l'arborescence sera à chaque fois différente. 

    Ce que j'aimerais faire c'est chaque fois que je récupère un fichier xml, avoir la liste des champs et pouvoir dire que tel champs correspond à tel champ dans mon entité.

    Merci d'avance pour votre aide !

    -
    Edité par BanjoSf4 17 juillet 2019 à 13:02:35

    • Partager sur Facebook
    • Partager sur Twitter

    Symfony 4 : Serializer - Name converter

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown