Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Symfony 4] Erreur Formulaire d'édition enfant

Sujet résolu
    20 octobre 2018 à 3:18:08

    Bonsoir,

    Je suis entrain de développer une partie "événement" et chacun de ces événements contient des "slides" et lorsque je souhaitent modifier une slide d'un événement je me retrouve avec cet érreur : 

    Argument 3 passed to App\Controller\Admin\Projet\SlideController::edit() must be an instance of App\Entity\Client\Projet\Slide, instance of App\Entity\Client\Projet\Evenement given, called in /opt/lampp/htdocs/Alpha/vendor/symfony/http-kernel/HttpKernel.php on line 149


    De cet erreur je comprend qu'il récupère l'entité Evenement et non Slide, hors dans mon code rien ne fais appel a "Evenement", en regardant la Stack Trace je m'aperçois que c'est l'attribut Request qui fais appel a Evenement :/

      at src/Controller/Admin/Projet/SlideController.php:52
      at App\Controller\Admin\Projet\SlideController->edit('8', object(Request), object(Evenement))
         (vendor/symfony/http-kernel/HttpKernel.php:149)
      at Symfony\Component\HttpKernel\HttpKernel->handleRaw(object(Request), 1)
         (vendor/symfony/http-kernel/HttpKernel.php:66)
      at Symfony\Component\HttpKernel\HttpKernel->handle(object(Request), 1, true)
         (vendor/symfony/http-kernel/Kernel.php:188)
      at Symfony\Component\HttpKernel\Kernel->handle(object(Request))
         (public/index.php:37)
    

    Je ne comprend pas du tout comment je pourrais remédier a cela, mon code : 

    <?php
    
    namespace App\Controller\Admin\Projet;
    
    use App\Entity\Client\Projet\Slide;
    use App\Form\Client\Projet\SlideType;
    
    use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\HttpFoundation\Response;
    use Symfony\Component\Routing\Annotation\Route;
    
    /**
     * @Route("/intervenant/admin/projet/slide")
     */
    class SlideController extends AbstractController
    {
    
        /**
         * @Route("/modifier/{id}", name="admin_projet_slide_edit", methods="GET|POST")
         */
        public function edit($id, Request $request, Slide $slide): Response
        {
            $form = $this->createForm(SlideType::class, $slide);
            $form->handleRequest($request);
    
            if ($form->isSubmitted() && $form->isValid()) {
                $this->getDoctrine()->getManager()->flush();
    
                $this->addFlash(
                'notice',
                'Le slide a correctement été modifier.'
                );
    
                return $this->redirectToRoute('admin_projet_slide_edit', ['id' => $slide->getId()]);
            }
    
            return $this->render('admin/projet/slide/edit.html.twig', [
                'id' => $id,
                'slide' => $slide,
                'form' => $form->createView(),
            ]);
        }


    Si quelqu'un a une idée, sa fait plus de 48h que je flanche là-dessus je désespère :/

    Merci d'avance

    -
    Edité par TuxZero 21 octobre 2018 à 2:58:34

    • Partager sur Facebook
    • Partager sur Twitter
      20 octobre 2018 à 10:43:01

      Si l'erreur est déclenchée lors du handleRequest, cela veut dire que l'erreur vient de ton SlideType.
      • Partager sur Facebook
      • Partager sur Twitter
        20 octobre 2018 à 16:50:14

        Je n'ai pourtant rien qui appel l'événement dans mon slideType, Voici mon SlideType :

        <?php
        
        namespace App\Form\Client\Projet;
        
        use App\Entity\Client\Projet\Slide;
        use App\Form\Client\Projet\ListingMetiersType;
        
        use Symfony\Component\Form\AbstractType;
        use Symfony\Component\Form\FormBuilderInterface;
        use Symfony\Component\OptionsResolver\OptionsResolver;
        use Symfony\Component\Form\Extension\Core\Type\DateTimeType;
        
        class SlideType extends AbstractType
        {
            public function buildForm(FormBuilderInterface $builder, array $options)
            {
                $builder
                    ->add('nbrInter')
                    ->add('specialites', ListingMetiersType::class)
                    ->add('dateDepart', DateTimeType::class, array(
                          'widget' => 'single_text',
                    ))
                    ->add('dateFin', DateTimeType::class, array(
                          'widget' => 'single_text',
                    ))
                    ->add('salaire')
                    ->add('vac')
                ;
            }
        
            public function configureOptions(OptionsResolver $resolver)
            {
                $resolver->setDefaults([
                    'data_class' => Slide::class,
                ]);
            }
        }
        


        Mais peut-être que cela est due au fait que l'entité Slide soit une entité enfant de Evenement

        -
        Edité par TuxZero 21 octobre 2018 à 2:13:20

        • Partager sur Facebook
        • Partager sur Twitter
          21 octobre 2018 à 11:43:31

          Salut !

          Il y a une chose qui me surprend : pourquoi récupérer l'ID d'un objet Slide et l'objet complet, alors que ce dernier contient par définition l'ID ? Je te proposerais de remplacer le premier paramètre de ta méthode — paramètre qui n'est pas spécialement utile en soi — par le troisième, et ne garder donc que deux paramètres, Slide $slide, Request $request. Pour récupérer l'ID de l'objet Slide dans ton template, tu fais tout simplement slide.id.

          -
          Edité par Ymox 21 octobre 2018 à 11:43:47

          • Partager sur Facebook
          • Partager sur Twitter
            21 octobre 2018 à 16:15:49

            Salut,

            Effectivement l'attribut ID n'a aucune utilité, il me servais quand j'ai essayer de récupérer l'entité autrement qu'avec l'objet Slide, car j'ai essayer de récupérer l'entité depuis le repository et l'id associé, mais étant sans succès j'ai décider d'esssayer de repasser par l'objet Slide toujours sans succès :/

            Merci de ta précision.

            -
            Edité par TuxZero 22 octobre 2018 à 0:26:11

            • Partager sur Facebook
            • Partager sur Twitter
              22 octobre 2018 à 10:29:15

              Tu as toujours la même erreur ?

              Si oui, est-ce qu'on peut voir l'entier de ton SlideController ?

              • Partager sur Facebook
              • Partager sur Twitter
                22 octobre 2018 à 14:37:53

                Mon slideController en entier : 

                <?php
                
                namespace App\Controller\Admin\Projet;
                
                use App\Entity\Client\Projet\Slide;
                use App\Form\Client\Projet\SlideType;
                use App\Form\Client\Projet\IntervenantType;
                
                use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
                use Symfony\Component\HttpFoundation\Request;
                use Symfony\Component\HttpFoundation\Response;
                use Symfony\Component\Routing\Annotation\Route;
                
                /**
                 * @Route("/intervenant/admin/projet/slide")
                 */
                class SlideController extends AbstractController
                {
                
                    /**
                     * @Route("/assigner/intervenant/{id}", name="admin_projet_slide_intervenant_new", methods="GET|POST")
                     */
                    public function editSlideIntervenant(Request $request, Slide $slide): Response
                    {
                        $form = $this->createForm(IntervenantType::class, $slide);
                        $form->handleRequest($request);
                
                        if ($form->isSubmitted() && $form->isValid()) {
                
                            $slide = $form->getData();
                            $em = $this->getDoctrine()->getManager();
                            $em->persist($slide);
                            $em->flush();
                
                            $this->addFlash(
                            'notice',
                            'Les intervenants ont correctement été ajouter.'
                            );
                          }
                
                
                        return $this->render('admin/projet/slide/intervenant.html.twig', [
                            'form' => $form->createView(),
                        ]);
                    }
                
                    /**
                     * @Route("/modifier/{id}", name="admin_projet_slide_edit", methods="GET|POST")
                     */
                    public function edit(Request $request, Slide $slide): Response
                    {
                        $form = $this->createForm(SlideType::class, $slide);
                        $form->handleRequest($request);
                
                        if ($form->isSubmitted() && $form->isValid()) {
                            $this->getDoctrine()->getManager()->flush();
                
                            $this->addFlash(
                            'notice',
                            'Le slide a correctement été modifier.'
                            );
                
                            return $this->redirectToRoute('admin_projet_slide_edit', ['id' => $slide->getId()]);
                        }
                
                        return $this->render('admin/projet/slide/edit.html.twig', [
                            'slide' => $slide,
                            'form' => $form->createView(),
                        ]);
                    }
                
                    /**
                     * @Route("/delete/{id}", name="admin_projet_slide_delete", methods="DELETE")
                     */
                    public function delete(Request $request, Slide $slide): Response
                    {
                        if ($this->isCsrfTokenValid('delete'.$slide->getId(), $request->request->get('_token'))) {
                            $em = $this->getDoctrine()->getManager();
                            $em->remove($slide);
                            $em->flush();
                        }
                
                        return $this->redirectToRoute('admin_projet_slide_index');
                    }
                }
                



                J'ai aussi un SlideDatatable qui affiche les données du slide le voici :

                <?php
                
                namespace App\Controller\Admin\Projet;
                
                use App\Entity\Client\Projet\Slide;
                use App\Datatables\Admin\SlideDatatable;
                use Sg\DatatablesBundle\Datatable\DatatableInterface;
                use Symfony\Bundle\FrameworkBundle\Controller\Controller;
                use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
                use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
                use Symfony\Component\HttpFoundation\Request;
                use Symfony\Component\HttpFoundation\Response;
                use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
                
                
                /**
                 * projetDatatables controller.
                 *
                 * @package App\Controller\Admin\Projet
                 */
                class slideDatatablesController extends Controller
                {
                    /**
                     * Lists all Post entities.
                     *
                     * @param Request $request
                     *
                     * @Method("GET")
                     *
                     * @return Response
                     * @Route("/intervenant/admin/projet/{id}/slide/voir", name="admin_projet_slide_voir")
                     */
                    public function indexAction($id, Request $request)
                    {
                        $isAjax = $request->isXmlHttpRequest();
                
                
                        // Get your Datatable ...
                        //$datatable = $this->get('app.datatable.post');
                        //$datatable->buildDatatable();
                
                        // or use the DatatableFactory
                        /** @var DatatableInterface $datatable */
                        $datatable = $this->get('sg_datatables.factory')->create(SlideDatatable::class);
                        $datatable->buildDatatable();
                
                
                        $isAjax = $request->isXmlHttpRequest();
                
                        if ($request->isXmlHttpRequest()) {
                            $responseService = $this->get('sg_datatables.response');
                            $responseService->setDatatable($datatable);
                
                            $datatableQueryBuilder = $responseService->getDatatableQueryBuilder();
                
                            /** @var QueryBuilder $qb */
                            $qb = $datatableQueryBuilder->getQb();
                            $qb->andWhere('slide.evenement = :evenement');
                            $qb->setParameter('evenement', $id);
                
                            return $responseService->getResponse();
                        }
                
                        return $this->render('admin/projet/slide/voir.html.twig', array(
                            'datatable' => $datatable,
                            'id' => $id,
                        ));
                    }
                
                    /**
                     * @Method("GET")
                     *
                     * @return Response
                     * @Route("/intervenant/admin/projet/slide/impression/{id}", methods="GET", name="admin_projet_slide_impression")
                     */
                    public function printAction()
                    {
                        return $this->render('admin/projet/projet/impression.html.twig');
                    }
                
                /**
                 * Bulk delete action.
                 *
                 * @param Request $request
                 *
                 * @Route("/intervenant/admin/projet/slide/suppression", name="admin_projet_slide_bulk_delete")
                 * @Method("POST")
                 *
                 * @return Response
                 */
                public function bulkDeleteAction(Request $request)
                {
                    $isAjax = $request->isXmlHttpRequest();
                
                    if ($isAjax) {
                        $choices = $request->request->get('data');
                        $token = $request->request->get('token');
                
                        if (!$this->isCsrfTokenValid('multiselect', $token)) {
                            throw new AccessDeniedException('The CSRF token is invalid.');
                        }
                
                        $em = $this->getDoctrine()->getManager();
                        $repository = $em->getRepository('App\Entity\Client\Projet\Slide');
                
                        foreach ($choices as $choice) {
                            $entity = $repository->find($choice['id']);
                            $em->remove($entity);
                        }
                
                        $em->flush();
                
                        return new Response('Success', 200);
                    }
                
                    return new Response('Bad Request', 400);
                }
                
                }
                



                -
                Edité par TuxZero 22 octobre 2018 à 14:39:46

                • Partager sur Facebook
                • Partager sur Twitter
                  22 octobre 2018 à 15:50:17

                  Ymox a écrit:

                  Tu as toujours la même erreur ?

                  -
                  Edité par Ymox 22 octobre 2018 à 15:50:38

                  • Partager sur Facebook
                  • Partager sur Twitter
                    22 octobre 2018 à 16:24:27

                    Oui toujours la même erreur, hormis le fait que le 3 soit remplacer par 2

                    -
                    Edité par TuxZero 22 octobre 2018 à 16:25:57

                    • Partager sur Facebook
                    • Partager sur Twitter
                      22 octobre 2018 à 16:27:37

                      Manifestement, il y a un petit souci avec ParamConverter qui ne voit pas quelle entité il faut récupérer… Ce qui est surprenant, vu que le type du paramètre est bien défini…

                      Dans un premier temps, essaie de mettre une annotation ParamConverter explicite ?

                      Autre point plus ou moins stupide, mais autant tenter : si tu mets vraiment les paramètres dans l'ordre que j'avais donné plutôt que de supprimer simplement le premier, est-ce que ça change ?

                      -
                      Edité par Ymox 22 octobre 2018 à 16:28:53

                      • Partager sur Facebook
                      • Partager sur Twitter
                        24 octobre 2018 à 16:18:40

                        Salut,

                        Désoler pour la réponse tardive j'ai dû refaire toutes mon interface graphique je ne pouvais pas revenir sur ce problème.

                        J'ai essayer de changer l'ordre pour : 'Slide $slide, Request $request' cela ne change rien

                        -----

                        edit

                        ---------

                        Enfait j'ai simplement mis le mauvais repository dans mon entité Slide, j'appeler Evenement au lieu de Slide, j'ai honte de moi d'un coup :/

                        -
                        Edité par TuxZero 24 octobre 2018 à 17:07:20

                        • Partager sur Facebook
                        • Partager sur Twitter

                        [Symfony 4] Erreur Formulaire d'édition enfant

                        × 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