Bonjour à tous !

Je ne parviens pas à valider mes formulaires, car les tokens sont toujours invalides.
Pourtant, j'ai suivi la documentation.

Mon controller :

...
$submittedToken = $request->request->get('_token');

if ($form->isSubmitted() && $form->isValid() && $this->isCsrfTokenValid('opinion_form', $submittedToken)) { ...

Mon template Twig

...
<input type="hidden" name="_token" value="{{ csrf_token('opinion_form') }}">
...

J'ai essayé aussi avec la fonction {{ form_row(form._token) }}, mais le résultat est le même.
Le formulaire n'est validé que lorsqu'il n'y a pas de champ token.

Je vous remercie pour votre aide !

2 réponses


Akli Ouamara
Réponse acceptée

salut
je ne sais pas si tu essaie directement avec form builder generé par symfony il integre automatiquement les token. sinon si tu es dans l'obligation de faire un formulaire manuel tu nous poste le code d'erreur

Luc-A
Auteur

Bonsoir,

Merci Akli et désolé pour mon retard.

En fait, j'ai du faire une erreur ailleurs, car dan certains formulaires, ça fonctionne.

Pour te répondre, je fais un formulaire manuel.

Voici l'erreur :

The CSRF token is invalid. Please try to resubmit the form.
Caused by:

Symfony\Component\Security\Csrf\CsrfToken {#944 ▼
  -id: "opinion"
  -value: ""
}

Voici ma page vue avec Twig :

{% block body %}
  <h1>Les avis </h1>

  {% for message in app.flashes('success') %}

    {{ message }}

  {% endfor %}

  <form method="post">

  <section class="training-form">

    <section class="field">{#
      #}<section class="opinion">{#
        #}<input type="hidden" id="opinion_rate" name="opinion[rate]" value="">{#
        #}<img src="{{ asset('img/star.svg') }}" class="star" onmouseover="rating.hover(this, 1);" onmouseout="rating.out(this);" onclick="rating.set(this, 1);">{#
        #}<img src="{{ asset('img/star.svg') }}" class="star" onmouseover="rating.hover(this, 2);" onmouseout="rating.out(this);" onclick="rating.set(this, 2);">{#
        #}<img src="{{ asset('img/star.svg') }}" class="star" onmouseover="rating.hover(this, 3);" onmouseout="rating.out(this);" onclick="rating.set(this, 3);">{#
        #}<img src="{{ asset('img/star.svg') }}" class="star" onmouseover="rating.hover(this, 4);" onmouseout="rating.out(this);" onclick="rating.set(this, 4);">{#
        #}<img src="{{ asset('img/star.svg') }}" class="star" onmouseover="rating.hover(this, 5);" onmouseout="rating.out(this);" onclick="rating.set(this, 5);">{#
        #}<section class="opinion-background" id="opinion-background"></section>{#
      #}</section>{#
    #}</section>

    <section class="field">
      <label for="opinion_opinion" class="required">Opinion</label>
      <textarea id="opinion_opinion" name="opinion[opinion]"></textarea>
    </section>

    <section class="field">
      {# {{ form_row(form._token) }} #}
      <input type="hidden" name="_token" value="{{ csrf_token('opinion_form') }}">
      <button>Soumettre</button>
    </section>

  </section>

  </form>

{% endblock %}

Voici le contrôleur qui gère la vue :

class OpinionsController extends AbstractController
{
    /**
     * @Route("/opinions/{id}", name="opinions")
     */
    public function index(int $id, Request $request, TrainingRepository $repository, EntityManagerInterface $em): Response
    {
        $opinion = new Opinion();
        $form = $this->createForm(OpinionType::class, $opinion);
        $form->handleRequest($request);
        $submittedToken = $request->request->get('_token');
        // dd($submittedToken);

        if ($form->isSubmitted() && $form->isValid() && $this->isCsrfTokenValid('opinion_form', $submittedToken)) { //  && $this->isCsrfTokenValid('opinion_form', $submittedToken)
            dump($submittedToken);
            $user = $this->getUser();
            $opinion->setIdTraining($id);
            $id_former = $repository->findIdFormerById($id);
            $opinion->setIdFormer($id_former);
            $opinion->setIdUser($user->getId());
            $opinion->setCreateAt(new \DateTime());
            $opinion->setReadByFormer(1);
            $em->persist($opinion);
            $em->flush();
            $this->addFlash('succès', 'Votre avis a bien été pris en compte.');
        }

        return $this->render('public/opinions.html.twig', [
            'controller_name' => 'OpinionsController',
            'form' => $form->createView(),
        ]);
    }
}

Je vous remercie pour votre aide !