IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Doctrine2 PHP Discussion :

Erreur lors de l'attribution d'un Id de projet


Sujet :

Doctrine2 PHP

  1. #1
    Candidat au Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2023
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Bâtiment

    Informations forums :
    Inscription : Janvier 2023
    Messages : 2
    Points : 4
    Points
    4
    Par défaut Erreur lors de l'attribution d'un Id de projet
    Bonjour,

    J'ai un peu cherché à gauche à droite mais je ne comprends toujours pas ce qui m'arrive. Je suis en PHP8.0. J'essaye d'attribuer un Id de projet à un contact et j'ai une erreur que je n'arrive pas à résoudre :

    App\Entity\Visa\VisaContacts::setIdProjet(): Argument #1 ($idProjet) must be of type ?App\Entity\Visa\VisaProjets, int given, called in C:\Users\lenovo\Documents\NetBeansProjects\syntherm-NEW\src\Controller\Visa\VisaController.php on line 153
    Le code de mon entité est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    <?php
     
    namespace App\Entity\Visa;
     
    use App\Entity\User\User;
    use App\Repository\Visa\VisaContactsRepository;
    use Doctrine\ORM\Mapping as ORM;
     
    /**
     * @ORM\Entity(repositoryClass=VisaContactsRepository::class)
     */
    class VisaContacts
    {
        /**
         * @ORM\Id
         * @ORM\GeneratedValue
         * @ORM\Column(type="integer")
         */
        private $id;
     
        /**
         * @ORM\ManyToOne(targetEntity=VisaProjets::class)
         */
        private $idProjet;
     
     
        /**
         * @ORM\ManyToOne(targetEntity=User::class)
         */
        private $idUser;
     
        public function getId(): ?int
        {
            return $this->id;
        }
     
        public function getIdProjet(): ?VisaProjets
        {
            return $this->idProjet;
        }
     
        public function setIdProjet(?VisaProjets $idProjet): self
        {
            $this->idProjet = $idProjet;
     
            return $this;
        }
     
        public function getIdUser(): ?User
        {
            return $this->idUser;
        }
     
        public function setIdUser(?User $idUser): self
        {
            $this->idUser = $idUser;
     
            return $this;
        }
    }
    Avec pour controller :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
        /**
         * @Route("/visa/nouveauContact/{idProjet}", name="visa_nouveau_contact", options={"expose" : true})
         */
        public function visa_nouveau_contact(EntityManagerInterface $em, Request $req, Session $session, Security $security, $idProjet)
        {
            //'Démarrage de session'
            $session->start();
            $session->set("lastPage", "visa_nouveau_contact");
            $this->em = $em;
            $this->user = $security->getUser();
     
            //création d'un nouvel object
            $nouveau_contact = new \App\Entity\Visa\VisaContacts();
            $form = $this->createForm(\App\Form\Visa\VisaContactsType::class, $nouveau_contact);
            $form->handleRequest($req);
     
            //Action si envoyé
            if ($form->isSubmitted() && $form->isValid()) {
     
                //ajout du compte user
                if ($this->user != null) {
                    $nouveau_contact->setIdUser($this->user);
                }
                //ajout de l'ID du projet ???
                dump($idProjet);
                $nouveau_contact->setIdProjet($idProjet);
     
                $em->persist($nouveau_contact);
                $em->flush();
            }
     
            return $this->render('visa/visa_nouveau_contact.html.twig', [
                'form' => $form->createView()
            ]);
        }
    Avez vous une idée ?

    Salutations,

    Thomas.

  2. #2
    Membre habitué Avatar de Chou-ette
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2018
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2018
    Messages : 55
    Points : 128
    Points
    128
    Par défaut
    Bonjour,


    En fait avec le mapping de Doctrine, vous ne manipulez pas directement l'identifiant du projet, mais un objet Projet directement, et c'est Doctrine en arrière plan qui se chargera de l'id de ce projet pour faire les relations qui vont bien.

    C'est pour cela que les getters et setters, à priori auto-générés, réclament et retournent des objets Projet et non des int d'id, vous noterez que c'est exactement la même chose pour vos User un peu plus bas, on ne manipule pas les ids, mais directement les objets User.

    C'est tout l'intérêt (et parfois le piège) des ORM, côté PHP on manipule des objets, et c'est Doctrine qui se débrouille avec les id et autres clé primaires/étrangères.

    Si vous continuez avec Doctrine, je vous recommande de renommer vos getter et setter en enlevant la particule Id => getProjet, setProjet, getUser...



    Maintenant avec ça, dans votre contrôleur il faudra donc récupérer le Projet lié à l'id passé en paramètre par l'URL pour enfin faire un setProjet($projet), et la ça passera sans soucis !

    Petit tips, si vous utilisez symfony avec Doctrine, ce qui a l'air d'être le cas, vous pouvez faire ceci pour la déclaration de votre controlleur :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    public function visa_nouveau_contact(EntityManagerInterface $em, Request $req, Session $session, Security $security, VisaProjet $projet)

    Doctrine ira chercher tout seul le projet lié à l'id passé en paramètre, ou null s'il n'existe pas



    EDIT : C'est d'ailleurs ce que vous faites déjà ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    //ajout du compte user
    if ($this->user != null) {
          $nouveau_contact->setIdUser($this->user);
    }
    Le setter est mal nommé, mais vous lui envoyez bien un objet user complet, pas juste l'id de l'user

  3. #3
    Candidat au Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2023
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Bâtiment

    Informations forums :
    Inscription : Janvier 2023
    Messages : 2
    Points : 4
    Points
    4
    Par défaut Merci, c'est très clair et cela a pu résoudre mon problème !!
    Merci, c'est très clair et cela a pu résoudre mon problème !!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. requete, problème de débutant
    Par focus dans le forum Access
    Réponses: 4
    Dernier message: 16/02/2006, 05h51
  2. Problème de débutant dans une requête
    Par decour dans le forum Access
    Réponses: 7
    Dernier message: 14/10/2005, 14h17
  3. [C#][service windows] problème de débutant avec 1 timer
    Par Nycos62 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 14/10/2005, 11h22
  4. Réponses: 3
    Dernier message: 24/09/2005, 09h34
  5. [DB2] problèmes de débutant
    Par rémi_tounul dans le forum DB2
    Réponses: 4
    Dernier message: 21/04/2005, 17h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo