Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Symfony 3.3] Déserialisation

    19 mai 2019 à 18:52:27

    Bonjour,

    J'aurai besoin de votre aide car je suis actuellement le cours "Construisez une API REST avec Symfony" et j'ai un petit problème.

    Alors voilà, j'ai deux entités, une User et une Projet. Le soucis est que lorsque j’envoie via POSTMAN un projet, celui-ci s'enregistre bien en BDD mais créer un nouvelle user au lieu de le lier a celui qui est déjà en base et qui est dans les données fournie a l'API.

    Comme vous pouvez le voir sur l'image, dans le projet envoyé via POSTMAN j'ai un User avec l'id 1, or mon api me renvoi le projet avec un User avec l'id 8... et quand je vais voir en base un User avec l'id 8 a été créé.

    Voici mon User.php

    <?php
    
    namespace AppBundle\Entity;
    
    use Doctrine\ORM\Mapping as ORM;
    use Doctrine\Common\Collections\ArrayCollection;
    
    /**
     * @ORM\Entity
     * @ORM\Table()
     */
    class User
    {
        /**
         * @ORM\Column(type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;
    
        /**
         * @ORM\Column(type="string", length=100)
         */
        private $login;
    
        /**
         * @ORM\Column(type="string", length=100)
         */     
        private $password;
    
        /**
         * @ORM\Column(type="string", length=100)
         */     
        private $mail;
    
        /**
         * @ORM\Column(type="string", length=100)
         */     
        private $nom;
    
        /**
         * @ORM\Column(type="string", length=100)
         */     
        private $prenom;
    
        /**
         * @ORM\Column(type="date")
         */     
        private $dateNaissance;
    
        /**
         * @ORM\OneToMany(targetEntity="Projet", mappedBy="user", cascade={"persist"})
         */
        private $projets;
    
        public function __construct()
        {
            $this->projets = new ArrayCollection();
        }
    
        public function getId(){
            return $this->id;
        }
    
        public function getLogin(){
            return $this->login;
        }
    
        public function setLogin($login){
            $this->login = $login;
            return $this;
        }
    
        public function getPassword(){
            return $this->password;
        }
    
        public function setPassword($password){
            $this->password = $password;
            return $this;
        }
    
        public function getMail(){
            return $this->mail;
        }
    
        public function setMail($mail){
            $this->mail = $mail;
            return $this;
        }
    
        public function getNom(){
            return $this->nom;
        }
    
        public function setNom($nom){
            $this->nom = $nom;
            return $this;
        }
    
        public function getPrenom(){
            return $this->nom;
        }
    
        public function setPrenom($prenom){
            $this->prenom = $prenom;
            return $this;
        }
    
        public function getDateNaissance(){
            return $this->dateNaissance;
        }
    
        public function setDateNaissance($dateNaissance){
            $this->dateNaissance = $dateNaissance;
            return $this;
        }
    
        public function getProjets(){
            return $this->projets;
        }
    
    }

    Voici mon Projet.php

    <?php
    
    namespace AppBundle\Entity;
    
    use Doctrine\ORM\Mapping as ORM;
    
    /**
     * @ORM\Entity
     * @ORM\Table()
     */
    class Projet
    {
        /**
         * @ORM\Column(type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;
    
        /**
         * @ORM\Column(type="date")
         */     
        private $dateDebut;
    
        /**
         * @ORM\Column(type="date")
         */     
        private $dateFin;
    
        /**
         * @ORM\ManyToOne(targetEntity="User", cascade={"all"}, fetch="EAGER")
         */
        private $user;
    
        public function getId(){
            return $this->id;
        }
    
        public function getdateDebut(){
            return $this->dateDebut;
        }
    
        public function setDateDebut($dateDebut){
            $this->dateDebut = $dateDebut;
            return $this;
        }
    
        public function getDateFin(){
            return $this->dateFin;
        }
    
        public function setDateFin($dateFin){
            $this->dateFin = $dateFin;
            return $this;
        }
    
        public function getUser(){
            return $this->user;
        }
    
        public function setUser($user){
            $this->user = $user;
            return $this;
        }
    
    }

    Et voici mon ProjetController.php

    <?php
    
    namespace AppBundle\Controller;
    
    use AppBundle\Entity\Projet;
    
    use FOS\RestBundle\Controller\FOSRestController;
    use FOS\RestBundle\Controller\Annotations as Rest;
    use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
    use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
    use Symfony\Component\HttpFoundation\Response;
    use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
    
    class ProjetController extends FOSRestController
    {
        /**
         * @Rest\Get(
         *      path = "/projet/{id}",
         *      name = "projet_show",
         *      requirements = {"id"="\d+"}
         * )
         * @Rest\View(
         *      statusCode = 201
         * )
         */
        public function showAction(Projet $projet){
            return $projet;
        }
    
        /**
         * @Rest\Post(
         *      path = "/addProjet",
         *      name = "app_projet_create"
         * )
         * @Rest\View(StatusCode = 201)
         * @ParamConverter("projet", converter="fos_rest.request_body")
         */
        public function createAction(Projet $projet){
    
            $em = $this->getDoctrine()->getManager();
    
            $em->persist($projet);
            
            $em->flush();
    
            return $this->view($projet, Response::HTTP_CREATED, ['Location' => $this->generateUrl('app_projet_create', ['id' => $projet->getId(), UrlGeneratorInterface::ABSOLUTE_URL])]);
        }
    }

    Si vous avez besoin de plus d'info n'hésitez pas.

    Merci d'avance ^^.



    -
    Edité par yoseil 19 mai 2019 à 18:54:04

    • Partager sur Facebook
    • Partager sur Twitter
      25 mai 2019 à 19:09:37

      Bonjour 

      Attention au cascade all  va voir la doc pour les détails. 

      • Partager sur Facebook
      • Partager sur Twitter

      Celui qui aime à apprendre est bien près du savoir " Confucius

        26 mai 2019 à 11:29:31

        Cascade 

        Persist il Persist le projet et le user 

        Delete il supprime le projet et le user 

        Essaies de respecter les normes API 

        /users/{id}/projects pour la liste des projets par user

        /projects/user/{id}

        Passe le user en requestParameter

        Supprime ton cascade all qui est très dangereux. 

        Par contre côté User tu peux u besoin rajouter cascade delete si tu veux lorsque tu supprimes un user supprimer aussi ces relations.

        • Partager sur Facebook
        • Partager sur Twitter

        Celui qui aime à apprendre est bien près du savoir " Confucius

          27 mai 2019 à 17:12:44

          Stoads merci pour tous ces conseils.

          Je vais aller modifier mon code :).

          • Partager sur Facebook
          • Partager sur Twitter

          [Symfony 3.3] Déserialisation

          × 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