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

Symfony PHP Discussion :

Undefined method getDoctrine in App\Validator\AmiValidator [4.x]


Sujet :

Symfony PHP

  1. #1
    Membre confirmé Avatar de Skunka
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2018
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2018
    Messages : 135
    Par défaut Undefined method getDoctrine in App\Validator\AmiValidator
    Bonsoir,
    Lors de la demande d'ami, j'ai ajouté un custom validator sur un champ du formulaire, pour vérifier que l'utilisateur existe.
    Quand j'envoie le formulaire pour le traitement, j'ai ce message d'erreur:

    Nom : syntax error.JPG
Affichages : 2153
Taille : 17,2 Ko

    Voici mon validateur:
    Code php : 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
     
    <?php
     
    namespace App\Validator;
     
    use Symfony\Component\Validator\Constraint;
    use Symfony\Component\Validator\ConstraintValidator;
    use App\Entity\Utilisateur;
    use App\Repository\AmiRepository;
     
    class AmiValidator extends ConstraintValidator
    {
     
        public function validate($value, Constraint $constraint)
        {
     
            /* @var $constraint \App\Validator\Ami */
            $util = $this->getDoctrine()->getRepository(Utilisateur::class)->findOneBy(['identifiant',$value]);
            if ($util) {
                return;
            } 
     
            // TODO: implement the validation here
            $this->context->buildViolation($constraint->message)
                ->setParameter('{{ value }}', $value)
                ->addViolation();
        }
    }

    Merci d'avance !

  2. #2
    Membre chevronné
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 351
    Par défaut
    Salut,

    Injecte le UtilisateurRepository dans le constructeur :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    private $userRepository;
     
    public function __construct(UtilisateurRepository $userRepository)
    {
        $this->userRepository = $userRepository;
    }
    Ensuite tu peux l'utiliser avec : $this->userRepository->findOneBy(['identifiant',$value]);

  3. #3
    Membre confirmé Avatar de Skunka
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2018
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2018
    Messages : 135
    Par défaut
    Super, je peux faire appelle à la fonction mais elle me retourne une erreur :
    Unrecognized field: 0
    Nom : 5614.JPG
Affichages : 2109
Taille : 13,9 Ko

    Ce qui correspond à la ligne:
    $util = $this->utilRepository->findOneBy(['identifiant',$value]);

  4. #4
    Membre chevronné
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 351
    Par défaut
    Est-ce que tu as bien une propriété "identifiant" sur l'entité concernée par l'appel de findOneBy ?

    N'hésite pas à nous montrer ton code en entier pour nous aider à comprendre d'où cela pourrait venir.

  5. #5
    Membre confirmé Avatar de Skunka
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2018
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2018
    Messages : 135
    Par défaut
    Attention, voila le code en entier:

    App\Entity\Utilisateur.php:
    Code php : 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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    <?php
     
    namespace App\Entity;
     
    use Doctrine\Common\Collections\ArrayCollection;
    use Doctrine\Common\Collections\Collection;
    use Doctrine\ORM\Mapping as ORM;
    use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
    use Symfony\Component\Security\Core\User\UserInterface;
     
    /**
     * @ORM\Entity(repositoryClass="App\Repository\UtilisateurRepository")
     */
    class Utilisateur
    {
        /**
         * @ORM\Id()
         * @ORM\GeneratedValue()
         * @ORM\Column(type="integer")
         */
        private $id;
     
        /**
         * @ORM\Column(type="string", length=255)
         */
        private $identifiant; // Ma propriété identifiant
     
        /**
         * @ORM\Column(type="string", length=255)
         */
        private $motDePasse;
     
        /**
         * @ORM\Column(type="string", length=255, nullable=true)
         */
        private $surnom;
     
        /**
         * @ORM\ManyToOne(targetEntity="App\Entity\Permission", inversedBy="utilisateurs")
         * @ORM\JoinColumn(nullable=false)
         */
        private $permission;
     
        /**
         * @ORM\Column(type="string", length=255, nullable=true)
         */
        private $email;
     
        public function __construct(Permission $permission=null){
            $this->permission = $permission;
        }
     
        public function getId(): ?int
        {
            return $this->id;
        }
     
        public function getIdentifiant(): ?string
        {
            return $this->identifiant;
        }
     
        public function setIdentifiant(string $identifiant): self
        {
            $this->identifiant = $identifiant;
     
            return $this;
        }
     
        public function getMotDePasse(): ?string
        {
            return $this->motDePasse;
        }
     
        public function setMotDePasse(string $motDePasse): self
        {
            $this->motDePasse = $motDePasse;
     
            return $this;
        }
     
        public function getSurnom(): ?string
        {
            return $this->surnom;
        }
     
        public function setSurnom(?string $surnom): self
        {
            $this->surnom = $surnom;
     
            return $this;
        }
     
        public function getPermission(): ?Permission
        {
            return $this->permission;
        }
     
        public function setPermission(?Permission $permission): self
        {
            $this->permission = $permission;
     
            return $this;
        }
     
        public function getEmail(): ?string
        {
            return $this->email;
        }
     
        public function setEmail(?string $email): self
        {
            $this->email = $email;
     
            return $this;
        }
     
    }

    AmiController:
    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
    <?php
     
    namespace App\Controller;
     
    use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\HttpFoundation\Session\Session;
    use App\Entity\Utilisateur;
    use App\Entity\Ami;
    use App\Form\AmiType;
     
    class AmiController extends AbstractController
    {
        public function index(Request $req) // Affiche les amis et le formulaire d'ajout
        {
            $util = $req->getSession()->get('util');
            $amis = $this->getDoctrine()->getRepository(Ami::class)->chargerListeAmi($util->getId());
     
            $form = $this->createForm(AmiType::class);
            $form->handleRequest($req);
     
            return $this->render('ami/index.html.twig', [
                'amis' => $amis,
                'form' => $form->createView(),
            ]);
        }
     
        public function add(Request $req){ // Appelé lors de l'ajout d'un ami
            $form = $this->createForm(AmiType::class);
            $form->handleRequest($req); 
     
            if ($form->isSubmitted() && $form->isValid()) { /
                $ami = new Ami($util, $target);
     
                $em = $this->getDoctrine()->getManager();
                $em->persist($ami);
                $em->flush();
     
                $this->addFlash('success','Requête d\'ami envoyée !');
     
                return $this->redirectToRoute('skunka_amis');
            } else {
                $this->addFlash('error','Utilisateur non trouvé !');
     
                return $this->redirectToRoute('skunka_amis');
            }
        }
    }
    ami/index.html.twig:
    Code twig : 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
    {% extends 'base.html.twig' %}
     
    {% block body %}
        <div class="ami_liste">
            <ul>
                {% for ami in amis %}
                    <li>{{ ami.utiltarget.identifiant }}</li>
                {% endfor %}
            </ul>
        </div>
     
        <div class="ami_ajout">
        {# {% for notice in app.session.flashBag.get('success','error') %}
            <h2>{{ notice }}</h2>
        {% endfor %} #}
     
        {{ form_start(form, {'attr':{'class':'form', 'action': path('skunka_amis_add') } }) }} // Formulaire d'ajout
            {{ form_errors(form) }}
            {{form_label(form.identifiant) }}
            {{ form_widget(form.identifiant) }}
            {{ form_errors(form.identifiant) }}
            {{ form_widget(form.save) }}
        {{ form_end(form) }}
        </div>
    {% endblock %}

    AmyType:
    Code php : 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
    <?php
     
    namespace App\Form;
     
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolver;
     
    use Symfony\Component\Form\Extension\Core\Type\TextType;
    use Symfony\Component\Form\Extension\Core\Type\SubmitType;
     
    use App\Validator\Ami;
     
    class AmiType extends AbstractType
    {
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('identifiant', TextType::class, [
                    'label' => 'Identifiant',
                    'constraints' => [new Ami() // AmiValidator
                ]])
                ->add('save', SubmitType::class, [
                    'label' => 'AJOUTER',
                    'attr' => ['class' => 'btn btn-info']
                ])
            ;
        }
     
        public function configureOptions(OptionsResolver $resolver)
        {
            $resolver->setDefaults([
                // Configure your form options here
            ]);
        }
    }

    Voilà, il y a normalement tout !

  6. #6
    Membre chevronné
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 351
    Par défaut
    Peux-tu aussi montrer le code à jour du AmiValidator stp ?

  7. #7
    Membre confirmé Avatar de Skunka
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2018
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2018
    Messages : 135
    Par défaut
    Je savais que j'avais oublié quelque chose, désolé:
    Code php : 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
    <?php
     
    namespace App\Validator;
     
    use Symfony\Component\Validator\Constraint;
    use Symfony\Component\Validator\ConstraintValidator;
    use App\Entity\Utilisateur;
    use App\Repository\UtilisateurRepository;
     
    class AmiValidator extends ConstraintValidator
    {
        private $utilRepository;
     
        public function __construct(UtilisateurRepository $utilRepository)
        {
            $this->utilRepository = $utilRepository;
        }
     
        public function validate($value, Constraint $constraint)
        {
     
     
     
            if (!$this->utilRepository->findOneBy(['identifiant',$value])) { // Ligne 23, celle qui déclenche l'erreur
                $this->context->buildViolation($constraint->message)
                ->setParameter('{{ value }}', $value)
                ->addViolation();
            } else {
                return;
            }
     
     
        }
    }

    Edit:

    J'ai changé cette ligne dans l'entité ami:
    private $statut = 0;
    et j'ai mis :
    private $statut = false;

  8. #8
    Membre chevronné
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 351
    Par défaut
    Je pense que le problème vient de ton contrôleur, quand tu crées le formulaire il faudrait "bindé" l'objet AmiType avec un objet de type Ami :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ...
    $ami = new Ami();
    $form = $this->createForm(AmiType::class, $fiche);
    $form->handleRequest($request);
     
    if ($form->isSubmitted() && $form->isValid()) {
    ...
    Et dans AmiType tu peux aussi préciser à quel type d'objet est lié ce formulaire :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public function configureOptions(OptionsResolver $resolver)
        {
            $resolver->setDefaults([
                'data_class' => Ami::class, // sans oublier d'importer le namespace use App\Entity\Ami;
            ]);
        }

    Pour l'explication, voilà ce qu'en dit la documentation ICI :
    Every form needs to know the name of the class that holds the underlying data (e.g. App\Entity\Task). Usually, this is just guessed based off of the object passed to the second argument to createForm() (i.e. $task). Later, when you begin embedding forms, this will no longer be sufficient.

    So, while not always necessary, it's generally a good idea to explicitly specify the data_class option by adding the following to your form type class:

  9. #9
    Membre confirmé Avatar de Skunka
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2018
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2018
    Messages : 135
    Par défaut
    Enfaite, le formulaire AmiType contient le champ 'identifiant' de l'entité Utilisateur

    Du coup AmiType est devenu ça:
    Code php : 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
    <?php
     
    namespace App\Form;
     
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolver;
     
    use Symfony\Component\Form\Extension\Core\Type\TextType;
    use Symfony\Component\Form\Extension\Core\Type\SubmitType;
     
    use App\Entity\Utilisateur;
     
    use App\Validator\Ami;
     
    class AmiType extends AbstractType
    {
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('identifiant', TextType::class, [
                    'label' => 'Identifiant',
                    'constraints' => [new Ami()
                ]])
                ->add('save', SubmitType::class, [
                    'label' => 'AJOUTER',
                    'attr' => ['class' => 'btn btn-info']
                ])
            ;
        }
     
        public function configureOptions(OptionsResolver $resolver)
        {
            $resolver->setDefaults([
                // Configure your form options here
                'data_class' => Utilisateur::class,
            ]);
        }
    }

    Et la fonction du controller AmiController:
    Code php : 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
    public function add(Request $req){
            $target = new Utilisateur();
            $form = $this->createForm(AmiType::class, $target);
            $form->handleRequest($req);
     
            if ($form->isSubmitted() && $form->isValid()) {
                dump($target);exit();
                $ami = new Ami($util, $target);
     
                $em = $this->getDoctrine()->getManager();
                $em->persist($ami);
                $em->flush();
     
                $this->addFlash('success','Requête d\'ami envoyée !');
     
                return $this->redirectToRoute('skunka_amis');
            } else {
                $this->addFlash('error','Utilisateur non trouvé !');
     
                return $this->redirectToRoute('skunka_amis');
            }
     
        }

    J'ai toujours la même erreur, ca ne dépasse pas le handleRequest() :/

  10. #10
    Membre chevronné
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 351
    Par défaut
    Ahhh je crois avoir trouvé, la méthode findOneBy attend un tableau ['identifiant' => $value], or visiblement d'après le message d'erreur dans le AmiValidator tu lui passes un tableau avec deux valeurs : ['identifiant',$value]

  11. #11
    Membre confirmé Avatar de Skunka
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2018
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2018
    Messages : 135
    Par défaut
    Effectivement c'était bien ça ! Mais j'ai encore un problème, le dernier j'espère! =>
    Notice: Undefined index: 000000007f80ef14000000005f98dd11
    AmiController:
    Code php : 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
    public function add(Request $req){
            $target = new Utilisateur();
            $form = $this->createForm(AmiType::class, $target);
            $form->handleRequest($req);
     
            if ($form->isSubmitted() && $form->isValid()) {
     
                $target =  $this->getDoctrine()->getRepository(Utilisateur::class)->findOneBy(['identifiant' => $target->getIdentifiant()]);
                $util = $req->getSession()->get('util');
                $ami = new Ami($util, $target);
                // dump($target, $util, $ami);exit();
     
                $em = $this->getDoctrine()->getManager();
                $em->persist($ami);
                $em->flush(); // LIGNE 47, celle qui provoque l'ereur
     
                $this->addFlash('success','Requête d\'ami envoyée !');
     
                return $this->redirectToRoute('skunka_amis');
            } else {
                $this->addFlash('error','Utilisateur non trouvé !');
     
                return $this->redirectToRoute('skunka_amis');
            }
     
        }

    Et un dump de $target, $util, $ami:
    Nom : dump.JPG
Affichages : 2146
Taille : 44,6 Ko

  12. #12
    Membre chevronné
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 351
    Par défaut
    Étant donné que l'erreur apparaît lors de la sauvegarde d'un objet de type Ami, est-ce que tu peux nous montrer le code de cette entité stp ?

  13. #13
    Membre confirmé Avatar de Skunka
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2018
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2018
    Messages : 135
    Par défaut
    Ami:
    Code php : 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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    <?php
     
    namespace App\Entity;
     
    use Doctrine\ORM\Mapping as ORM;
     
    /**
     * @ORM\Entity(repositoryClass="App\Repository\AmiRepository")
     */
    class Ami
    {
        /**
         * @ORM\Id()
         * @ORM\GeneratedValue()
         * @ORM\Column(type="integer")
         */
        private $id;
     
        /**
         * @ORM\Column(type="boolean")
         */
        private $statut = 0; // En attente
     
        /**
         * @ORM\ManyToOne(targetEntity="App\Entity\Utilisateur",cascade={"persist"})
         * @ORM\JoinColumn(nullable=false)
         */
        private $utilSource;
     
        /**
         * @ORM\ManyToOne(targetEntity="App\Entity\Utilisateur",cascade={"persist"})
         * @ORM\JoinColumn(nullable=false)
         */
        private $utilTarget;
     
        public function __construct(Utilisateur $source = null, Utilisateur $target = null){
            $this->utilSource = $source;
            $this->utilTarget = $target;
        }
     
        public function getId(): ?int
        {
            return $this->id;
        }
     
        public function getStatut(): ?bool
        {
            return $this->statut;
        }
     
        public function setStatut(bool $statut): self
        {
            $this->statut = $statut;
     
            return $this;
        }
     
        public function getUtilSource(): ?Utilisateur
        {
            return $this->$utilSource;
        }
     
        public function setUtilSource(?Utilisateur $utilSource): self
        {
            $this->utilSource = $utilSource;
     
            return $this;
        }
     
        public function getUtilTarget(): ?Utilisateur
        {
            return $this->utilTarget;
        }
     
        public function setUtilTarget(?Utilisateur $utilTarget): self
        {
            $this->utilTarget = $utilTarget;
     
            return $this;
        }
    }

  14. #14
    Membre chevronné
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 351
    Par défaut
    Je pense que le problème vient des relations entre les différentes entités mais sans plus de précisions...

    Tu pourrais montrer le message d'erreur en entier stp ? (la stack trace complète)
    Idem pour entité Permission qui est liée à l'entité Utilisateur.

  15. #15
    Membre confirmé Avatar de Skunka
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2018
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2018
    Messages : 135
    Par défaut
    Stack trace:
    ErrorException:
    Notice: Undefined index: 000000002284b0fc000000002c13aac4

    at vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php:2995
    at Doctrine\ORM\UnitOfWork->getEntityIdentifier(object(Permission))
    (vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/Entity/BasicEntityPersister.php:677)
    at Doctrine\ORM\Persisters\Entity\BasicEntityPersister->prepareUpdateData(object(Utilisateur))
    (vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/Entity/BasicEntityPersister.php:713)
    at Doctrine\ORM\Persisters\Entity\BasicEntityPersister->prepareInsertData(object(Utilisateur))
    (vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/Entity/BasicEntityPersister.php:275)
    at Doctrine\ORM\Persisters\Entity\BasicEntityPersister->executeInserts()
    (vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php:1073)
    at Doctrine\ORM\UnitOfWork->executeInserts(object(ClassMetadata))
    (vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php:386)
    at Doctrine\ORM\UnitOfWork->commit(null)
    (vendor/doctrine/orm/lib/Doctrine/ORM/EntityManager.php:359)
    at Doctrine\ORM\EntityManager->flush()
    (src/Controller/AmiController.php:47)
    at App\Controller\AmiController->add(object(Request))
    (vendor/symfony/http-kernel/HttpKernel.php:151)
    at Symfony\Component\HttpKernel\HttpKernel->handleRaw(object(Request), 1)
    (vendor/symfony/http-kernel/HttpKernel.php:68)
    at Symfony\Component\HttpKernel\HttpKernel->handle(object(Request), 1, true)
    (vendor/symfony/http-kernel/Kernel.php:198)
    at Symfony\Component\HttpKernel\Kernel->handle(object(Request))
    (public/index.php:25)
    J'ai l'impression que c'est l'objet permission qui pose probleme, dans le screen du dump(), il n'y avait que l'id de permission de renseigné.
    Entité Permission:
    Code php : 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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    <?php
     
    namespace App\Entity;
     
    use Doctrine\Common\Collections\ArrayCollection;
    use Doctrine\Common\Collections\Collection;
    use Doctrine\ORM\Mapping as ORM;
     
    /**
     * @ORM\Entity(repositoryClass="App\Repository\PermissionRepository")
     */
    class Permission
    {
        /**
         * @ORM\Id()
         * @ORM\GeneratedValue()
         * @ORM\Column(type="integer")
         */
        private $id;
     
        /**
         * @ORM\Column(type="string", length=255)
         */
        private $libelle;
     
        /**
         * @ORM\OneToMany(targetEntity="App\Entity\Utilisateur", mappedBy="permission")
         */
        private $utilisateurs;
     
        public function __construct()
        {
            $this->utilisateurs = new ArrayCollection();
        }
     
        public function getId(): ?int
        {
            return $this->id;
        }
     
        public function getLibelle(): ?string
        {
            return $this->libelle;
        }
     
        public function setLibelle(string $libelle): self
        {
            $this->libelle = $libelle;
     
            return $this;
        }
     
        /**
         * @return Collection|Utilisateur[]
         */
        public function getUtilisateurs(): Collection
        {
            return $this->utilisateurs;
        }
     
        public function addUtilisateur(Utilisateur $utilisateur): self
        {
            if (!$this->utilisateurs->contains($utilisateur)) {
                $this->utilisateurs[] = $utilisateur;
                $utilisateur->setPermission($this);
            }
     
            return $this;
        }
     
        public function removeUtilisateur(Utilisateur $utilisateur): self
        {
            if ($this->utilisateurs->contains($utilisateur)) {
                $this->utilisateurs->removeElement($utilisateur);
                // set the owning side to null (unless already changed)
                if ($utilisateur->getPermission() === $this) {
                    $utilisateur->setPermission(null);
                }
            }
     
            return $this;
        }
    }

  16. #16
    Membre chevronné
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 351
    Par défaut
    Je pense que le problème décrit ici est de même nature que le tient (et visiblement la solution proposée était pertinente) : https://stackoverflow.com/a/46681996
    Mais j'ai du mal à me plonger dans ton code sans tout avoir sous les yeux et les mains (le code, la base de données, le profiler, etc) et je ne suis pas certain de bien comprendre l'explication donnée concernant le fonctionnement de Doctrine qui explique l'erreur obtenue...

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

Discussions similaires

  1. [PDO] Call to undefined method PDOStatement::lastinsertid()
    Par megacool dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 18/10/2008, 15h32
  2. [Artichow] Call to undefined method Graph::getDrawer()
    Par belocom dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 17/04/2008, 22h56
  3. Réponses: 0
    Dernier message: 25/02/2008, 17h28
  4. erreur 1180: Call to a possibly undefined method
    Par Tosh dans le forum ActionScript 3
    Réponses: 2
    Dernier message: 09/12/2007, 23h02
  5. undefined method `cattr_accessor' for ActiveRecord::Base:Cl
    Par r0nsync dans le forum Ruby on Rails
    Réponses: 2
    Dernier message: 02/08/2007, 14h41

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