Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème avec la réservation de places de cinéma

Problème avec la réservation de places de cinéma en Symfony

Sujet résolu
    6 avril 2024 à 18:17:42

    Bonjour à tous,

    J'ai récemment développé un site web avec Symfony pour la réservation de places de cinéma. Cependant, je rencontre un problème avec le processus de réservation et j'aurais besoin d'aide pour le résoudre.

    Le problème que je rencontre est que lorsque je soumets le formulaire de réservation, rien ne se passe. Je ne vois pas d'erreur dans les logs Symfony et aucun enregistrement n'est créé en base de données.

    Sur les logs, on m'indique de mettre void sur mes form types, ce que j'ai fait, et maintenant je n'ai pas d'erreur...

    Le github du projet : https://github.com/xavgdt66/Cin-ma/commits/main/

    ReservationController :

    class ReservationController extends AbstractController
    {
        private $entityManager;
    
        public function __construct(EntityManagerInterface $entityManager)
        {
            $this->entityManager = $entityManager;
        }
    
        #[Route('/reservation/{id}', name: 'reservation_film')]
        public function reserve(Request $request, Movie $movie): Response
        {
            $maxPlaces = $movie->getSalles()->first()->getNombrePlaces(); // Exemple, à adapter selon votre modèle
    
            $form = $this->createForm(ReservationType::class, null, ['max_places' => $maxPlaces]);
            $form->handleRequest($request);
    
            if ($form->isSubmitted() && $form->isValid()) {
                dump($form->getData());
    
                $reservation = new Reservation();
    
                $reservation->setMovie($movie);
                $reservation->setNumberOfSeats($form->get('nombrePlaces')->getData());
    
                $this->entityManager->persist($reservation);
                $this->entityManager->flush();
    
                return $this->redirectToRoute('app_home');
            }
    
            return $this->render('reservation/reserve.html.twig', [
                'form' => $form->createView(),
                'movie' => $movie,
            ]);
        }

    Mon Movie/id ( Détails de chaque film avec le form booking en bas )

     #[Route('/movie/{id}', name: 'app_movie_show')]
        public function showMovie($id, EntityManagerInterface $em): Response
        {
            $movie = $em->getRepository(Movie::class)->find($id);
    
            if (!$movie) {
                throw $this->createNotFoundException('Film non trouvé');
            }
    
            $form = $this->createForm(ReservationType::class);
    
            return $this->render('movie/show.html.twig', [
                'movie' => $movie,
                'reservation_form' => $form->createView(),
            ]);
        }

    et mon ReservationFormType :

    class ReservationFormType extends AbstractType
    {
        public function buildForm(FormBuilderInterface $builder, array $options) : void
        {
            $builder
                ->add('nombrePlaces', IntegerType::class, [
                    'label' => 'Nombre de places à réserver',
                    'attr' => ['min' => 1, 'max' => $options['max_places']]
                ])
                ->add('submit', SubmitType::class, ['label' => 'Réserver']);
        }
    
        public function configureOptions(OptionsResolver $resolver) : void
        {
            $resolver->setDefaults([
                'max_places' => null, 
            ]);
        }
    }
    






    • Partager sur Facebook
    • Partager sur Twitter
      7 avril 2024 à 9:29:57

      Salut

      As-tu vérifié que tu passais bien aux lignes 19 à 29 de l'action que tu nous montres ?

      D'autre part, pourquoi est-ce que tu ne fais pas en sorte que ton ReservationFormType enregistre directement dans un objet Reservation ?

      -
      Edité par Ymox 7 avril 2024 à 9:30:10

      • Partager sur Facebook
      • Partager sur Twitter
        7 avril 2024 à 16:13:30

        Salut 

        Que veux tu dire par "passais" de l'action ? Si c'est le système qui permet d'enregistrait dans la bdd la réservation ? Oui il me semble .. 

        Est pour faire en sorte que ReservationFormType enregistrer automatiquement , je ne pensais que ceux n'était pas possible , à moin que j'ai mal compris 

        • Partager sur Facebook
        • Partager sur Twitter
          7 avril 2024 à 22:46:03

          Est-ce que le code aux lignes 19 à 29 est exécuté ? Si oui, vérifie dans l'outil de débogage de Symfony que la requête avant la redirection n'a pas une erreur masquée du fait de ladite redirection, justement. L'outil de débogage conserve un historique des données liées aux X dernières requêtes (je ne sais pas exactement combien), donc tu dois pouvoir retrouver.

          • Partager sur Facebook
          • Partager sur Twitter
            8 avril 2024 à 17:47:38

            Salut sur le profiler je ne voie aucune erreur ... 

            -
            Edité par Spawnkiller66 8 avril 2024 à 17:48:37

            • Partager sur Facebook
            • Partager sur Twitter
              9 avril 2024 à 9:39:50

              J'en déduis que tu as donc scrupuleusement vérifié que le code que j'ai mentionné est bien exécuté.

              Du coup, comment sais-tu qu'il n'y a aucun enregistrement, il devrait s'afficher quelque part sur la page, ou pour l'instant tu regardes directement en base ?

              • Partager sur Facebook
              • Partager sur Twitter
                9 avril 2024 à 16:57:07

                Salut

                Comment je peux voir que cela s'execute bien ?

                Je regarder directement en bdd 

                • Partager sur Facebook
                • Partager sur Twitter
                  10 avril 2024 à 8:33:25

                  Avec une exécution pas à pas en débogueur, ou à l'ancienne avec une instruction spécifique témoin. Il semble que tu as mis une instruction debug(), est-ce que tu en vois le résultat quelque part au même endroit que là où l'on peut voir ce que tu as montré dans ce message précédent, surtout pour la même requête (ou une autre de soumission dudit formulaire).

                  Note que si tu n'as jamais constaté de redirection et que tu vois cela directement avec les outils de débogage quand la page se réaffiche après avoir soumis le formulaire, on pourrait bien avoir la réponse.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    10 avril 2024 à 18:24:05

                    Bonjour 

                    Je ne voie pas les erreurs j'ai mis cela dump pourtant. Et non je ne voie le résultat nul part ... 

                    Dans mon code j'ai mis une redirection vers la page home mais rien ne se passe 

                    • Partager sur Facebook
                    • Partager sur Twitter
                      10 avril 2024 à 23:27:24

                      Donc assez clairement, le code n'est pas exécuté.

                      Ajoute dump($form->isSubmitted(), $form->isValid()); juste avant l'équivalent de la ligne 18 du code du formulaire fourni. Au moins l'un des deux devrait afficher false, si un seul des deux, lequel ?
                      Je rappelle à toute fin utile que dump() dans du code PHP devrait ajouter un élément soit dans la barre de débogage (ce qui confirmerait que le code n'est pas exécuté), soit parmi tout ce qui est listé dans le panel de débogage pour la requête de soumission du formulaire qu'on est en train de tester. L'icône est un réticule.

                      -
                      Edité par Ymox 10 avril 2024 à 23:29:38

                      • Partager sur Facebook
                      • Partager sur Twitter
                        11 avril 2024 à 22:43:43

                        Salut 

                        Dump n'affiche rien meme sur mes logs ... , je pense que ceux n'est donc pas executer 

                        • Partager sur Facebook
                        • Partager sur Twitter
                          12 avril 2024 à 11:20:20

                          Là tu ne me montres qu'une partie de la page de débogage, celle de gauche et celle du haut m'intéressent aussi. Par contre, on peut voir que l'on est sur l'action showMovie, or tu nous as montré le code de reserve… soit la redirection est faite, soit ton formulaire n'est pas soumis sur la bonne action. Vu la manière utilisée pour le créer, je pense que c'est bien ce dernier cas, du coup il faut ajouter $form->setAction(…) pour que ses données soient envoyées là où il le faut. Par défaut, c'est l'action courante, et celle-ci ne traite pas le formulaire.

                          • Partager sur Facebook
                          • Partager sur Twitter
                            12 avril 2024 à 13:59:38

                            Salut 

                            Tu peux me dire quel onglet t'intéresse come ça je clique dessus. 

                            Enfaite mon formulaire de réservation est sur la même vue que show movie/id. 

                            Pour le setAction sur la doc de symfony 7 je n'ai pas trouver, j'ai l'impression que c'est uniquement en symfony 3. 

                            Voila mon ReservationControlleur: 

                            #[Route('/reservation/{id}', name: 'reservation_film')]
                                public function reserve(Request $request, Movie $movie): Response
                                {
                            
                                    $reservation = new Reservation();
                            
                                    $maxPlaces = $movie->getSalles()->first()->getNombrePlaces();
                            
                                    $form = $this->createForm(ReservationFormType::class, null, ['max_places' => $maxPlaces]);
                                    $form->handleRequest($request);
                            
                                    //dump($form->isSubmitted(), $form->isValid()); // Ajout de cette ligne pour déboguer
                            
                                    if (dump($form->isSubmitted() && $form->isValid())) {
                                        //$reservation = new Reservation(); 
                            
                                        $reservation->setMovie($movie);
                                        $reservation->setNumberOfSeats($form->get('nombrePlaces')->getData());
                            
                                        $this->entityManager->persist($reservation);
                                        $this->entityManager->flush();
                            
                                        return $this->redirectToRoute('app_home');
                                    }
                            
                                    return $this->render('reservation/reserve.html.twig', [
                                        'form' => $form->createView(),
                                        'movie' => $movie,
                                    ]);
                                }

                            Mon MovieControlleur.php 

                             #[Route('/movie/{id}', name: 'app_movie_show')]
                                public function showMovie($id, EntityManagerInterface $em): Response
                                {
                                    $movie = $em->getRepository(Movie::class)->find($id);
                            
                                    if (!$movie) {
                                        throw $this->createNotFoundException('Film non trouvé');
                                    }
                            
                                    $form = $this->createForm(ReservationFormType::class);
                            
                                    return $this->render('movie/show.html.twig', [
                                        'movie' => $movie,
                                        'reservation_form' => $form->createView(),
                                    ]);
                                }




                            • Partager sur Facebook
                            • Partager sur Twitter
                              12 avril 2024 à 15:44:51

                              setAction() existe pour FormBuilder, pas pour Form. Mais il y a tout de même moyen de spécifier une action lors de l'utilisation de createForm : en passant en troisième paramètre un tableau avec la clé action et comme valeur l'URL sur laquelle le formulaire doit être soumis. Voir ici (en date) par exemple.

                              • Partager sur Facebook
                              • Partager sur Twitter
                                14 avril 2024 à 14:48:11

                                Salut en me servant du code du github que tu m'as donne j'ai fait cela mais ça ne fonctionne pas : 

                                #[Route('/reservation/{id}', name: 'reservation_film')]
                                    public function reserve(Request $request, Movie $movie): Response
                                    {
                                        $reservation = new Reservation();
                                
                                        $maxPlaces = $movie->getSalles()->first()->getNombrePlaces();
                                
                                        $form = $this->createForm(ReservationFormType::class, $reservation, [
                                            'action' => $this->generateUrl('reservation_film', ['id' => $movie->getId()]),
                                            'max_places' => $maxPlaces
                                        ]);
                                
                                        $form->handleRequest($request);
                                
                                        if (dump($form->isSubmitted() && $form->isValid())) {
                                
                                            $reservation->setMovie($movie);
                                            $reservation->setNumberOfSeats($form->get('nombrePlaces')->getData());
                                
                                            $this->entityManager->persist($reservation);
                                            $this->entityManager->flush();
                                
                                            return $this->redirectToRoute('app_home');
                                        }
                                
                                        return $this->render('reservation/reserve.html.twig', [
                                            'form' => $form->createView(),
                                            'movie' => $movie,
                                        ]);
                                    }



                                • Partager sur Facebook
                                • Partager sur Twitter
                                  14 avril 2024 à 20:56:32

                                  Je n'avais pas fait assez attention, mais tu as mis le dump() dans le if, je doute effectivement que cela fonctionne ainsi… Fais comme ci-après.

                                  dump($form->isSubmitted(), $form->isValid());
                                  if ($form->isSubmitted() && $form->isValid()) {

                                  -
                                  Edité par Ymox 14 avril 2024 à 20:56:50

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    14 avril 2024 à 21:57:35

                                    J'ai fait comme tu m'as dit mais dump n'affiche rien du tout ...
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      15 avril 2024 à 9:22:25

                                      Il faut aussi ajouter l'action dans MovieController::showMovie, là tu ne le fais que dans l'action qui va traiter ledit formulaire…

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        15 avril 2024 à 17:18:54

                                        Merci enfaite j'était sur le mauvais contrôleur depuis le début.... tout cela pour ça ... 

                                        Voila mon contrôleur qui enregistre en bdd  

                                        #[Route('/movie/{id}', name: 'app_movie_show')]
                                            public function showMovie($id, EntityManagerInterface $em, Request $request): Response
                                            {
                                                $reservation = new Reservation();
                                        
                                                $movie = $em->getRepository(Movie::class)->find($id);
                                        
                                                if (!$movie) {
                                                    throw $this->createNotFoundException('Film non trouvé');
                                                }
                                        
                                                $form = $this->createForm(ReservationFormType::class);
                                                $form->handleRequest($request);
                                        
                                                if ($form->isSubmitted() && $form->isValid()) {
                                        
                                                    $reservation->setMovie($movie);
                                                    $reservation->setNumberOfSeats($form->get('nombrePlaces')->getData());
                                        
                                                    $this->entityManager->persist($reservation);
                                                    $this->entityManager->flush();
                                        
                                                    return $this->redirectToRoute('app_home');
                                                }
                                        
                                                return $this->render('movie/show.html.twig', [
                                                    'movie' => $movie,
                                                    'reservation_form' => $form->createView(),
                                                ]);
                                            }

                                        Ducoup ma fonction  " réserve " ne me sert à rien je peux l'enlever ? 

                                        -
                                        Edité par Spawnkiller66 15 avril 2024 à 17:21:38

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          16 avril 2024 à 11:40:41

                                          A toi de voir, pour ma part j'aurais conservé l'action qui traite le formulaire pour qu'elle ne fasse "que cela", et n'aurais pas prévu le traitement dans l'action qui affiche un film. Seulement, si tu penses qu'il y aura des erreurs dans le traitement du formulaire de réservation et que tu souhaites réafficher la même page avec la même URL, alors tu peux te passer de ta « fonction " réserve " ».

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            16 avril 2024 à 14:19:29

                                            D'accord merci , je mets le topic en résolue
                                            • Partager sur Facebook
                                            • Partager sur Twitter

                                            Problème avec la réservation de places de cinéma

                                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                            • Editeur
                                            • Markdown