Bonjour, j'ai mis ce post dans débuter car je débute, mais après comme c'est déjà un projet j'espère que je n'ai pas gaffé,

Pour la création d’un projet de site communautaire à propos de livres, je cherche à afficher une page avec 1 livre et les commentaires des utilisateurs.
Les commentaires entrés en durs dans la BDD s’affichent bien. J'essaie d’insérer les nouveaux commentaires dans la BDD en vain depuis un moment. Chaque commentaire est relié à un livre et aussi à l’utilisateur connecté qui l’a posté. La table Comment est constitué des colonnes id, user_id, book_id, content, et date.

Voici ma fonction du MainController ainsi que l’erreur qui va avec :

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
61
62
63
64
65
66
67
68
69
70
71
 /**
     * @Route("/detail-de-la-bd/{titleBook}/", name="displayOneBD")
     * Page détail d'une seule BD
     */
    public function displayOneBD(Request $request, $titleBook)
    {
        // Récupération de la session
        $session = $this->get('session');
        // Si account existe en session, alors l'utilisateur est déjà connecté à un compte donc on le redirige sur la page d'accueil
        if($session->has('account')){
            return $this->redirectToRoute('home');
        }
 
        //via le repository des Book, on récupère la BD qui correspond à book_id dans l'url
        $bookRepo = $this->getDoctrine()->getRepository(Book::class);
        $commentRepo = $this->getDoctrine()->getRepository(Comment::class);
        $userRepo = $this->getDoctrine()->getRepository(User::class);
        $book = $bookRepo->findOneByTitle($titleBook);
        $user = $this->getUser();
        dump($session->get('account'));
        //si formulaire cliqué
        if ($request->isMethod('POST')){
            //TODO remettre le STR_REPLACE
            //$content = str_replace(array("\n", "\r"), ' ', nl2br($request->request->get('content')));
            $content= $request->request->get('inputComment');
            // Bloc des vérifs
            if(!preg_match('#^[a-zA-Z]+(([\',. -][a-zA-Z ])?[a-zA-Z]*){1,120}$#', $content)){
                $errors['invalidContent'] = true;
 
            }
            //dump($userRepo->findOneById($user)->getId());
           // dump($bookRepo->findOneById($book)->getId());
            // Si pas d'erreurs
            if(!isset($errors)){
                dump($user);
                // On crée le nouveau commentaire, puis on l'hydrate avec les données adéquates
                $comment = new Comment();
                $comment
                    ->setContent($content)  // On donne le contenu venant du formulaire
                    ->setDate(new DateTime)
                    ->setUser($session->get('account'))
                    ->setBook($bookRepo->findOneById($book)->getId())
                ;
                // Grâce au manager des entités, on porte le nouveau commentaire à la connaissance de Doctrine puis on flush pour l'enregistrer en bdd
                $em = $this->getDoctrine()->getManager();
                $comment = $em->merge($comment);    // Merge au lieu de persist car l'auteur du commentaire est un objet "détaché" de Doctrine alors qu'il existe bien dans la bdd, ce qui permettra de le ratacher. $comment = a été rajouté devant pour qu'il contienne le nouveau comment "attaché" à Doctrine
                $em->flush();
                return $this->render('displayOneBD.html.twig', array(
                    'book' => $book,
                    'comments' => $comments
                ));
 
            }
            $comments = $book->getComments();
            return $this->render('displayOneBD.html.twig', array(
                'errors' => $errors,
                'book' => $book,
                'comments' => $comments
            ));
            //dump($book);
        }
        //AFFICHER LES COMMs
        $comments = $book->getComments();
 
        return $this->render('displayOneBD.html.twig', array(
            'book' => $book,
            'comments' => $comments
        ));
 
 
    }
Attempted to call an undefined method named "getBook" of class "App\Controller\MainController".
Sachant que quand je dump de on me renvoie null, j’étais pourtant tombé sur un topic qui disait de faire cela
J’en ai déduit que c’est la partie du code ou je crée mon nouveau comment qui pose problème, j’ai tenté différente choses*:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
$comment = new Comment();
$comment
->setContent($content) // On donne le contenu venant du formulaire
->setDate(new DateTime)
->setUser($session->get('account'))
->setBook($bookRepo->findOneById($book)->getId())
;
.. sans succès d’ailleurs le dump de
Code : Sélectionner tout - Visualiser dans une fenêtre à part
$session->get(‘account’)
renvoie null lui aussi. Mais cette fois il n’y a pas d’erreur, les commentaires ne se créent pas.

Je vous met la vue ainsi que l’entity pour que vous puissiez avoir tous les éléments :

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
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
{% extends "base.html.twig" %}
 
{% block title %}{{ book.getTitle() }}{% endblock %}
 
{% block body %}
 
 
<!-- <p class="alert alert-danger col-12">BD inexistante !</p> -->
 
<main class="container my-4">
    <div class="row bg-white comic_case my-2 p-4">
        <h1 class="col-12 text-center style_title"> {{ book.getTitle() }} </h1>
        <h2 class="col-12 text-center"> {{ book.getAuthor() }} - {{ book.getIllustrator() }} - {{ book.getEditor() }}
        </h2>
    </div>
 
    <article class="row">
        <div class="col-lg-4 comic_case bg-white mb-2 m-lg-2 ">
            <!-- PB l'image ne se colle pas dans l'espace à droite quand on est en talle sm, malgré mon mx-auto... -->
            <div class="row">
                <img src="{{book.getImgUrl()}}" class="col-12 pt-3" alt="couverture" title="nom_de_la_BD" />
                <button type="button" class="btn btn-secondary btn-lg col-7 mx-auto my-4 ">Ajouter à ma
                    bibliothèque</button>
            </div>
        </div>
        <div class="col-lg-7 comic_case bg-white mb-2 m-lg-2">
            <div class="row p-2 p-lg-4">
                <h3 class="col-12">Résumé</h3>
                <p class="my-3"> {{ book.getSynopsis() }} </p>
            </div>
        </div>
        <hr>
    </article>
    <!-- fin de l'article -->
 
    <!-- partie commentaire a repeter avec un forIn -->
    {% for comment in comments %}
    <div class="row comic_case bg-white my-2">
        <div class="col-lg-2">
            <i class="fas fa-user fa-5x col-12 pt-4 ml-3"></i>
        </div>
        <div class="col-lg-9 my-3">
            <p>
                {{comment.content}}
            </p>
        </div>
    </div>
    {% endfor %}
 
    <div>
        <form action="{{ path('displayOneBD',{ 'titleBook' : book.title }) }}" method="POST"><input type="text" name="inputComment"><input type="submit" value="commenter"></form>
    </div>
</main>
{% endblock %}

l'entity Comment :

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
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
<?php
 
namespace App\Entity;
 
use Doctrine\ORM\Mapping as ORM;
 
/**
 * @ORM\Entity(repositoryClass="App\Repository\CommentRepository")
 */
class Comment
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;
 
    /**
     * @ORM\Column(type="string", length=2000)
     */
    private $content;
 
    /**
     * @ORM\Column(type="datetime")
     */
    private $date;
 
    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="comments")
     * @ORM\JoinColumn(nullable=false)
     */
    private $user;
 
    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Book", inversedBy="comments")
     * @ORM\JoinColumn(name="book_id", referencedColumnName="id", nullable=false)
     */
    private $book;
 
    public function getId(): ?int
    {
        return $this->id;
    }
 
    public function getContent(): ?string
    {
        return $this->content;
    }
 
    public function setContent(string $content): self
    {
        $this->content = $content;
 
        return $this;
    }
 
    public function getDate(): ?\DateTimeInterface
    {
        return $this->date;
    }
 
    public function setDate(\DateTimeInterface $date): self
    {
        $this->date = $date;
 
        return $this;
    }
 
    public function getUser(): ?User
    {
        return $this->user;
    }
 
    public function setUser(?User $user): self
    {
        $this->user = $user;
 
        return $this;
    }
 
    public function getBook(): ?Book
    {
        return $this->book;
    }
 
    public function setBook(?Book $book): self
    {
        $this->book = $book;
 
        return $this;
    }
}
Si vous pouviez me donner des pistes je vous en serai reconnaissant..




C'est bon j'ai réussi, je met la fonction au cas ou ça pourait servir à quelq'un !


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
    public function displayOneBD(Request $request, $titleBook)
    {
        // Récupération de la session
        $session = $this->get('session');
        //via le repository des Book, on récupère la BD qui correspond à book_id dans l'url
        $bookRepo = $this->getDoctrine()->getRepository(Book::class);
        $commentRepo = $this->getDoctrine()->getRepository(Comment::class);
        $userRepo = $this->getDoctrine()->getRepository(User::class);
        $book = $bookRepo->findOneByTitle($titleBook);
        $user = $this->getUser();
 
        //si formulaire cliqué
        if ($request->isMethod('POST')){
            //TODO remettre le STR_REPLACE
            //$content = str_replace(array("\n", "\r"), ' ', nl2br($request->request->get('content')));
            $content= $request->request->get('inputComment');
            // Bloc des vérifs
            if(!preg_match('#^[a-zA-Z]+(([\',. -][a-zA-Z ])?[a-zA-Z]*){1,120}$#', $content)){
                $errors['invalidContent'] = true;  
                dump('contenu invalide'); 
            }  
            // Si pas d'erreurs
            if(!isset($errors)){
                $entityManager = $this->getDoctrine()->getManager();
                $sessionUser= $session->get('account');
                $user = $userRepo->find($sessionUser->getId());
                //$book = $bookRepo->find($bookUser->getId());
 
                // On crée le nouveau commentaire, puis on l'hydrate avec les données adéquates
                $comment = new Comment();
                $comment ->setContent($content); // On donne le contenu venant du formulaire
                $comment->setDate(new DateTime);
                $comment->setUser($user);
                $comment->setBook($book);   
                $entityManager->persist($comment);   
                $entityManager->flush();
            }
        }
        //AFFICHER LES COMMs
        $comments = $book->getComments();
        return $this->render('displayOneBD.html.twig', array(
            'book' => $book,
            'comments' => $comments
        ));
    }
dans la partie à hydrater il fallait surtout mettre les objets en entiers et surtout pas en extraire les book_id et user_id