Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Erreur Symfony4] dans le controlleur, setUser()

setUser() must be an instance App\Entity\User or null

Sujet résolu
    13 juillet 2018 à 2:32:33

    j'essai de crée un blog avec symfony 4 , soit la table des User est lier avec la table des commentaires avec la relation ManyToOne le user peut faire un commentaire et un commentaire repartie a un seul user

    le probléme que j'ai rencontré que l'rosque je submit le formulaire de commentaire dans ma page il m'indique cette erreur:

    Argument 1 passed to App\Entity\Comment::setUser() must be an instance of App\Entity\User or null, integer given, called in C:\Users\sami_\demo\src\Controller\BlogController.php on line 72

    User c'est l'entité et BlogController.php c'est le controlleur d'ou vient mon formulaire


    mon entité user :

    <?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\User\UserInterface;
    use Symfony\Component\Validator\Constraints as Assert;
    use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

    /**
    * @ORM\Entity(repositoryClass="App\Repository\UserRepository")
    * @UniqueEntity(
    * fields= {"email"},
    * message= "l'email existe deja"
    * )
    */
    class User implements UserInterface
    {
    /**
    * @ORM\Id()
    * @ORM\GeneratedValue()
    * @ORM\Column(type="integer")
    */
    private $id;

    /**
    * @ORM\Column(type="string", length=255)
    * @Assert\Email()
    */
    private $email;

    /**
    * @ORM\Column(type="string", length=255)
    */
    private $username;

    /**
    * @ORM\Column(type="string", length=255)
    * @Assert\Length(min="8", minMessage="Min 8 caractéres")
    */
    private $password;

    /**
    * @Assert\EqualTo(propertyPath="password", message="Vous devez taper le meme mot de passe")
    */
    public $confirm_password;

    /**
    * @ORM\OneToMany(targetEntity="App\Entity\Comment", mappedBy="user", orphanRemoval=true)
    */
    private $comments;

    public function __construct()
    {
    $this->comments = new ArrayCollection();
    }

    public function getId()
    {
    return $this->id;
    }

    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 eraseCredentials()
    {
    // TODO: Implement eraseCredentials() method.
    }

    public function getSalt()
    {
    // TODO: Implement getSalt() method.
    }

    public function getRoles()
    {
    // TODO: Implement getRoles() method.
    return ['ROLE_USER'];
    }

    /**
    * @return Collection|Comment[]
    */
    public function getComments(): Collection
    {
    return $this->comments;
    }

    public function addComment(Comment $comment): self
    {
    if (!$this->comments->contains($comment)) {
    $this->comments[] = $comment;
    $comment->setUser($this);
    }

    return $this;
    }

    public function removeComment(Comment $comment): self
    {
    if ($this->comments->contains($comment)) {
    $this->comments->removeElement($comment);
    // set the owning side to null (unless already changed)
    if ($comment->getUser() === $this) {
    $comment->setUser(null);
    }
    }

    return $this;
    }
    }


    Ma methode dans le controleur

    /**
    * @Route("/blog/article/{id}", name="article_show")
    */
    public function show(Article $article,Request $request, ObjectManager $manager)
    {

    //id utilisateur
    $id = $this->getUser()->getId();


    $comment = new Comment();
    $form = $this->createForm(CommentType::class, $comment);
    $form->handleRequest($request);


    if($form->isSubmitted() && $form->isValid()){

    $comment->setCreatedAt(new \DateTime());
    $comment->setArticle($article);
    $comment->setUser($id);

    $manager->persist($comment);
    $manager->flush();
    return $this->redirectToRoute('article_show', ['id' => $article->getId()]);
    }


    //$repo = $this->getDoctrine()->getRepository(Article::class);
    //$article = $repo->find($id);
    return $this->render('blog/show.html.twig', [
    'controller_name' => 'BlogController',
    'article' => $article,
    'formComment' => $form->createView()
    ]);
    }


    quelqu’un pourrais m'aider svp

    -
    Edité par simonDaSimoné 13 juillet 2018 à 12:03:40

    • Partager sur Facebook
    • Partager sur Twitter
      13 juillet 2018 à 7:57:26

      Bonjour,

      L'erreur est très explicite. Ta fonction setUser() s'attends à avoir une entité User ou un null en guise de paramètre. Et toi tu lui donnes un entier en lui passant $id.

      Remplace cette ligne: 

      $id = $this->getUser()->getId();

      Par: 

      $user = $this->getUser();

      Et cette ligne:

      $comment->setUser($id);

      Par:

      $comment->setUser($user);

      Tous devrait rentrer dans l'ordre.

      Bonne journée.

      • Partager sur Facebook
      • Partager sur Twitter
        13 juillet 2018 à 8:01:03

        Bonjour,

        Mauvais titre

        Le titre est un élément important qui ne doit pas être négligé. N'oubliez pas cette règle simple : le titre idéal résume la question que vous allez poser en une petite phrase. Il doit permettre aux visiteurs de se repérer facilement dans le forum visité et d'identifier le sujet à sa seule lecture.

        Vous pouvez utiliser divers préfixes comme [Erreur], [MySQL], [Compatibilité], etc... Aussi, pensez à consulter les règles propres à chaque forum (visibles dans les topics épinglés en haut des sections).

        De plus, choisir un bon titre permet de rendre plus faciles les recherches des autres membres.

        Les titres de type "besoin d'aide" ou "problème" ne sont pas tolérés.

        Pour modifier votre titre, éditez le premier message de votre sujet.

        (titre originel : Symfony 4)

        • Partager sur Facebook
        • Partager sur Twitter

        Pas d'aide concernant le code par MP, le forum est là pour ça :)

          13 juillet 2018 à 11:29:18

          je vous remercie les gars sa marche parfaitement 

          et d'accord Lamecarlate je vais le modifier tt de suite bonne journée à tous

          • Partager sur Facebook
          • Partager sur Twitter
            13 juillet 2018 à 11:47:51

            Euh oui mais non "Erreur" c'est pire comme titre ! Un titre doit décrire le problème, pas juste dire qu'il y en a un.
            • Partager sur Facebook
            • Partager sur Twitter

            Pas d'aide concernant le code par MP, le forum est là pour ça :)

            [Erreur Symfony4] dans le controlleur, setUser()

            × 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