Partage
  • Partager sur Facebook
  • Partager sur Twitter

Relation et Utilisateur /Symfony

Symfony

Sujet résolu
    15 mai 2021 à 18:48:01

    Bonjour je débute sur le magnifique Symfony et j'ai créer :

    1. Entité Users qui récupère via un formulaire l'Email et le mot de passe

    2. Entité InfoUser qui récupère récupère via un formulaire le (nom, prenom, adresse, numéro) que j'ai relationné avec l'id de l'entité Users (pour savoir a quel utilisateur appartient ces informations).

    Tous fonctionne sauf que je n'arrive pas à récupérer l'id courrant de l'entité Users. 

    J'ai tanté de faire cela (En étant connecté avec un utilisateur):

    1.  

    /**
         * @Route("/info", name="info")
         */
        public function CreatCv(Request $response, EntityManagerInterface $manager)
        {
            $form = $this->createForm(CreatCvType::class,$InfoUser);
            $form->handleRequest($response);
            
            if($form->isSubmitted() && $form->isValid()){
                $InfoUser->setUser($this->getUser()->getId());
               $manager->persist($InfoUser);
               $manager->flush();
            }
            return $this->render('main/CreatCV.html.twig', [
              'form_cv' => $form->createView(),
            ]);
        }

      mais il me demande une instance de Users ".

    Argument 1 passed to App\Entity\InfoUser::setUser() must be an instance of App\Entity\Users or null, int given,

    "

    J'ai donc tenté de faire :

    /**
         * @Route("/info", name="info")
         */
        public function CreatCv(Request $response, EntityManagerInterface $manager)
        {
    
            $user = new Users;
            
            $InfoUser = new InfoUser;
          
            $form = $this->createForm(CreatCvType::class,$InfoUser);
            $form->handleRequest($response);
            
            if($form->isSubmitted() && $form->isValid()){
                $InfoUser->setUser($user->getId());
               $manager->persist($InfoUser);
               $manager->flush();
            }
            return $this->render('main/CreatCV.html.twig', [
              'form_cv' => $form->createView(),
            ]);
        }

    mais le résultat c'est que  l'identifiant = null  puisque c'est justement une nouvelle instance et j'ai une erreur SQL .

    Donc ma question est comment je devrais faire dans ce cas là ? 

    -
    Edité par b-init 15 mai 2021 à 18:48:41

    • Partager sur Facebook
    • Partager sur Twitter
      15 mai 2021 à 20:05:50

      Bonjour,

      Il suffit tout simplement de mettre dans setUser l'user et pas son id. Symfony s'occupera de bien remplir la table infouser.

      A toi

      • Partager sur Facebook
      • Partager sur Twitter
        16 mai 2021 à 11:28:11

        merci de ta réponse mais j'ai maintenant cette erreur peut-être que ça n'a rien a voir  .. :

        A new entity was found through the relationship 'App\Entity\InfoUser#User' that was not configured to cascade persist operations for entity: App\Entity\Users@000000003c76a30900000000686af707. To solve this issue: Either explicitly call EntityManager#persist() on this unknown entity or configure cascade persist this association in the mapping for example @ManyToOne(..,cascade={"persist"}). If you cannot find out which entity causes the problem implement 'App\Entity\Users#__toString()' to get a clue.

        l'entité Users :

        <?php
        
        namespace App\Entity;
        
        use Serializable;
        use Doctrine\ORM\Mapping as ORM;
        use App\Repository\UsersRepository;
        use Doctrine\Common\Collections\Collection;
        use Doctrine\Common\Collections\ArrayCollection;
        use Symfony\Component\Security\Core\User\UserInterface;
        
        
        
        /**
         * @ORM\Entity(repositoryClass=UsersRepository::class)
         */
        class Users implements UserInterface, \Serializable
        {
            /**
             * @ORM\Id
             * @ORM\GeneratedValue
             * @ORM\Column(type="integer")
             */
            private $id;
        
            /**
             * @ORM\Column(type="string", length=255)
             */
            private $Name;
        
            /**
             * @ORM\Column(type="string", length=255)
             */
            private $FirstName;
        
            /**
             * @ORM\Column(type="string", length=255)
             */
            private $Email;
        
            /**
             * @ORM\Column(type="string", length=255)
             */
            private $UserName;
        
            /**
             * @ORM\Column(type="string", length=255)
             */
            private $Password;
        
            /**
             * @ORM\OneToMany(targetEntity=InfoUser::class, mappedBy="Users")
             *      
             */
            private $infoUsers;
        
          
            
            public function __construct()
            {
                $this->infoUsers = new ArrayCollection();
            }
        
            public function getId(): ?int
            {
                return $this->id;
            }
        
            public function getName(): ?string
            {
                return $this->Name;
            }
        
            public function setName(string $Name): self
            {
                $this->Name = $Name;
        
                return $this;
            }
        
            public function getFirstName(): ?string
            {
                return $this->FirstName;
            }
        
            public function setFirstName(string $FirstName): self
            {
                $this->FirstName = $FirstName;
        
                return $this;
            }
        
            public function getEmail(): ?string
            {
                return $this->Email;
            }
        
            public function setEmail(string $Email): self
            {
                $this->Email = $Email;
        
                return $this;
            }
        
            public function getUserName(): ?string
            {
                return $this->UserName;
            }
        
            public function setUserName(string $UserName): self
            {
                $this->UserName = $UserName;
        
                return $this;
            }
        
            public function getPassword(): ?string
            {
                return $this->Password;
            }
        
            public function setPassword(string $Password): self
            {
                $this->Password = $Password;
        
                return $this;
            }
        
            public function getRoles()
            {
                return array('ROLE_USER');
            }
        
            public function getSalt()
            {
              return null;  
            }
        
            public function eraseCredentials(){
            
            }
        
            public function serialize()
            {
                return serialize(array(
                    $this->id,
                    $this->UserName,
                    $this->Password,
                    // see section on salt below
                    // $this->salt,
                ));
            }
        
            /** @see \Serializable::unserialize() */
            public function unserialize($serialized)
            {
                list (
                    $this->id,
                    $this->UserName,
                    $this->Password,
                    // see section on salt below
                    // $this->salt
                ) = unserialize($serialized);
            }
        
            /**
             * @return Collection|InfoUser[]
             */
            public function getInfoUsers(): Collection
            {
                return $this->infoUsers;
            }
        
            public function addInfoUser(InfoUser $infoUser): self
            {
                if (!$this->infoUsers->contains($infoUser)) {
                    $this->infoUsers[] = $infoUser;
                    $infoUser->setUser($this);
                }
        
                return $this;
            }
        
            public function removeInfoUser(InfoUser $infoUser): self
            {
                if ($this->infoUsers->removeElement($infoUser)) {
                    // set the owning side to null (unless already changed)
                    if ($infoUser->getUser() === $this) {
                        $infoUser->setUser(null);
                    }
                }
        
                return $this;
            }
        




        L'entité InfoUser :
        <?php
        
        namespace App\Entity;
        
        use App\Repository\InfoUserRepository;
        use Symfony\Component\Security\Core\User\UserInterface;
        use Doctrine\ORM\Mapping as ORM;
        
        /**
         * @ORM\Entity(repositoryClass=InfoUserRepository::class)
         */
        class InfoUser
        {
            /**
             * @ORM\Id
             * @ORM\GeneratedValue
             * @ORM\Column(type="integer")
             */
            private $id;
        
            /**
             * @ORM\ManyToOne(targetEntity=Users::class, inversedBy="infoUser")
             */
            private $User;
        
            /**
             * @ORM\Column(type="string", length=255)
             */
            private $Name;
        
            /**
             * @ORM\Column(type="string", length=255)
             */
            private $FirstName;
        
            public function getId(): ?int
            {
                return $this->id;
            }
        
            public function getUser(): ?Users
            {
                return $this->User;
            }
        
            public function setUser(?Users $User): self
            {
                $this->User = $User;
        
                return $this;
            }
        
            public function getName(): ?string
            {
                return $this->Name;
            }
        
            public function setName(string $Name): self
            {
                $this->Name = $Name;
        
                return $this;
            }
        
            public function getFirstName(): ?string
            {
                return $this->FirstName;
            }
        
            public function setFirstName(string $FirstName): self
            {
                $this->FirstName = $FirstName;
        
                return $this;
            }
        }
        
        le MainController :

        <?php
        
        namespace App\Controller;
        
        use Symfony\Component\Security\Core\Security;
        use App\Entity\Users;
        use App\Entity\InfoUser;
        use App\Form\CreatCvType;
        use Doctrine\ORM\EntityManagerInterface;
        use Symfony\Component\HttpFoundation\Request;
        use Symfony\Component\HttpFoundation\Response;
        use Symfony\Component\Routing\Annotation\Route;
        use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
        
        class MainController extends AbstractController
        {
            /**
             * @Route("/", name="main")
             */
            public function index(): Response
            {
                return $this->render('main/index.html.twig', [
                    'controller_name' => 'MainController',
                ]);
            }
        
            /**
             * @Route("/info", name="info")
             */
            public function CreatCv(Request $response, EntityManagerInterface $manager)
            {
        
                $user = new Users;
                
                $InfoUser = new InfoUser;
              
                $form = $this->createForm(CreatCvType::class,$InfoUser);
                $form->handleRequest($response);
                
                if($form->isSubmitted() && $form->isValid()){
                    $InfoUser->setUser($user);
                   $manager->persist($InfoUser);
                   $manager->flush();
                }
                return $this->render('main/CreatCV.html.twig', [
                  'form_cv' => $form->createView(),
                ]);
            }
        }
        

        Je comprend bien qu'il faut persister les L'entité mais c'est a mon sens ce que j'ai fait dans le controller ..?


        • Partager sur Facebook
        • Partager sur Twitter
          16 mai 2021 à 13:13:53

          Bonjour,

          Je pense que cela est dû au fait que tu crée un new user qu'ensuite tu persistes infouser, mais il ne sait pas quoi faire de user qui n'est pas "persisté" ni dans ton controller ni par l'entité infouser.

          Tu peux essayer soit de persiter ton user dans le controller, soit de rajouter dans ton entité infouser au niveau de la déclaration de la relation avec user:

          @ORM\ManyToOne(targetEntity=Users::class, inversedBy="InfoUser",cascade={"persist"})

          Enfin, sans rapport avec le sujet, une remarque en passant=> l'entité Users aurait dû s'appeler User. C'est une convention de nommage qui rend plus clair dans les pluriels les écritures de relation (OneToMany ou MaynyToMany)

          A toi

          -
          Edité par CarréDas1 16 mai 2021 à 13:16:31

          • Partager sur Facebook
          • Partager sur Twitter
            16 mai 2021 à 19:08:07

            dans les 2 cas cela me sort l'erreur :

            An exception occurred while executing 'INSERT INTO users (name, first_name, email, user_name, password) VALUES (?, ?, ?, ?, ?)' with params [null, null, null, null, null]:


            SQLSTATE[23000]: Integrity constraint violation: 1048 Le champ 'name' ne peut être vide (null)

            Du coup a ce que j'ai compris si je persist l'Entité Users il me considère quelle doit être non null .. (comme si j'ai faire un flush derrière ).
            Pourtant  récupérer l'identifiant courant du user c'est quelque chose de courant mais je ne trouve rien relié a symfony.
            Ok pour le User c'est vrai que je n'ai pas vu d'entité "Users" merci a toi .

            -
            Edité par b-init 16 mai 2021 à 19:23:16

            • Partager sur Facebook
            • Partager sur Twitter
              16 mai 2021 à 20:02:48

              C'est normal que user soit null si tu mets user = New Users.

              Soit tu t'adresses à l'user en ligne, alors user = $this->getUser(), soit tu veux un user particulier non en ligne auquel cas user = $ur->findOneById($id) où $ur est le repository de Users et $id l'id de l'utiliasteur dont tu souhaites modifier les infos.

              A toi

              • Partager sur Facebook
              • Partager sur Twitter
                17 mai 2021 à 16:50:10

                c'est ça:

                 /**
                     * @Route("/info", name="info")
                     */
                    public function CreatCv(Request $response, EntityManagerInterface $manager)
                    {
                
                        
                        
                        $InfoUser = new InfoUser;
                      
                        $form = $this->createForm(CreatCvType::class,$InfoUser);
                        $form->handleRequest($response);
                        
                        if($form->isSubmitted() && $form->isValid()){
                            
                            $InfoUser->setUser($this->getUser());
                            $manager->persist($InfoUser);
                            $manager->flush();
                          
                        }
                        return $this->render('main/CreatCV.html.twig', [
                          'form_cv' => $form->createView(),
                        ]);
                    }

                 comme tu a dis plus haut sympfony va comprendre que c'est  l'identifiant que je veux puisqu'il est relationné...

                En tout cas merci a toi tu m'a vraiment aidé ...

                -
                Edité par b-init 17 mai 2021 à 17:37:59

                • Partager sur Facebook
                • Partager sur Twitter

                Relation et Utilisateur /Symfony

                × 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