j'ai problème au niveau de la suppression d'un bien, en cliquant sur le boutton de suppression ça me rediriger toujour sur la route de Editer un bien
Voici le code de suppression

/**
     * @Route("/admin/property/{id}", name="admin.property.delete", methods="DELETE")
     * @return  \Symfony\Component\HttpFoundation\RedirectResponse
     * 
     */
    public function delete(Property $property,Request $request) : Response
    {
        if($this->isCsrfTokenValid('delete'. $property->getId(), $request->get('_token')))
        {
           $this->em->remove($property);
          $this->em->flush();

        }
          return $this->redirectToRoute('admin.property.index');
      }

et celui de Editer un Bien

 /**
     * @Route("/admin/property/{id}", name="admin.property.edit", methods="GET|POST")

     */
    public function edit(Property $property, Request $request) : Response
    {   
      $form = $this->createForm(PropertyType::class,$property);
        $form->handleRequest($request);
        if($form->isSubmitted() && $form->isValid())
        {
            $this->em->flush();
            return $this->redirectToRoute('admin.property.index');
        }
        return $this->render('admin/property/edit.html.twig', [
            'property' => $property,
            'form' =>$form->createView()
        ]);
    } 

Ce que je veux

je veux juste que lorqu'on cliquer sur le boutton de la suppression ça me redirige sur la page index.html.twig et ça supprime le bien

voici le contenu de index.html.twig

                <tr>
                    <td>{{ property.title }}</td>
                    <td>
                        <a href="{{ path('admin.property.edit', {id: property.id })}}" class="btn btn-secondary">Editer</a>

                        <form method="POST" action="{{ path('admin.property.delete', {id: property.id}) }}" style="display: inline-block;"
                        >
                        <input type="hidden" name="_method" value="DELETE">
                        <input type="hidden" name="_token" value="{{ csrf_token('delete' ~ property.id) }}">
                        <button class="btn btn-danger">Suppression</button>
                    </form>
                    </td>
                </tr>
                {% endfor %}
{% for property in properties %}
                <tr>
                    <td>{{ property.title }}</td>
                    <td>
                        <a href="{{ path('admin.property.edit', {id: property.id })}}" class="btn btn-secondary">Editer</a>

                        <form method="POST" action="{{ path('admin.property.delete', {id: property.id}) }}" style="display: inline-block;"
                        >
                        <input type="hidden" name="_method" value="DELETE">
                        <input type="hidden" name="_token" value="{{ csrf_token('delete' ~ property.id) }}">
                        <button class="btn btn-danger">Suppression</button>
                    </form>
                    </td>
                </tr>
                {% endfor %}

Ce que j'obtiens

Décrivez vos éventuelles erreurs ou ce que vous obtenez à la place de ce que vous attendez :(

9 réponses


Salut,

Les routes DELETE et EDIT sont identiques => /admin/property/{id}. Le router de symfony par conséquent trouve en premier la route EDIT et re redirige directement vers celle-ci.

Pour éviter ce problème, je te conseille de rajouter définir ta route EDIT par ceci => /admin/property/{id}/edit et DELETE par ceci => /admin/property/{id}/delete

Voilà, bon courage à toi.

Euler
Auteur

salut frère raizen ,
merci pour t l'intervention mais ça ne marche pas toujours , j'ai eu un message erreur:

No route found for "POST http://127.0.0.1:8000/admin/property/1/delete": Method Not Allowed (Allow: DELETE)

As tu compris le message d'erreur ? Essayes avec methods = {"DELETE"}

Euler
Auteur

ça n'a rien changer , j'ai essayer avec methods={"DELETE"}


    /**
     * @Route("/admin/property/{id}/delete", name="admin.property.delete", methods={"DELETE"})
     * @return  \Symfony\Component\HttpFoundation\RedirectResponse
     * 
     */
    public function delete(Property $property,Request $request) : Response
    {
        if($this->isCsrfTokenValid('delete'. $property->getId(), $request->get('_token')))
        {
           $this->em->remove($property);
          $this->em->flush();

        }
          return $this->redirectToRoute('admin.property.index');
      }

message d'erreur toujours la même choses :

Je te relance mais as tu compris le message d'erreur ?

Euler
Auteur

d'apres le message d'erreur il ne retrouve la chemin mais pourtant je l'ai bien indiquer dans la route ;
peut-être y'a quelque choses qui m'echappe

Non le message ne dit pas ca du tout. Il faut faire un effort et apprendre à lire les messages d'erreur plutot que de recopier bêtement le tuto pour lequel tu ne comprends pas ce que tu codes,surtout que là c'est très explicite. Sinon tu ne progresseras jamais. Le message te dit que tu accèdes à ton formulaire de suppression par la méthode POST mais que ta route n'autorise que méthode DELETE. Si tu ajoutes POST ou que tu changes DELETE par POST cela devrait fonctionner, si tu veux garder la méthode DELETE uniquement faut corriger ou changer un peu ton code.

Euler
Auteur

Merci beaucoup , je pense que tu as raison
j'ai remplacer dans la route methods={"DELETE"} par POST et ça marche

    /**
     * @Route("/admin/property/{id}/delete", name="admin.property.delete", methods={"POST"})
     * @return  \Symfony\Component\HttpFoundation\RedirectResponse
     * 
     */ 

Salut,

Quelques explications pour que ca marche avec methods={"DELETE"} et comprendre le message d'erreur:

Un formulaire HTML ne peut être soumis qu'avec la methode de type POST ou GET.

Si tu regardes bien ton formulaire, tu remarques qu'il possède l'attribut suivant : 'method="POST"' juste après la déclaration de ta balise '<form'. Voilà pourquoi lorsque tu cliques sur ton bouton de suppression la requete envoyé est de type POST et non DELETE.

Cependant, Symfony est capable grace à un peu de "magie" (on va pas rentrer dans les détails), de detecter le nom "\method" que l'on peut mettre dans un champ caché (hidden). Ce que tu as bien fais => <input type="hidden" name="_method" value="DELETE">

Ainsi lorsque que Symfony ou plus précisement le routeur va attraper le nom method il va voir que la valeur associé est DELETE. Ainsi, avec un peu de magie, il enverra une requete de type DELETE.

Explications faites, pourquoi ça ne marche pas ? Surement parce que dans la configuration (framework.yaml), tu as http_method_override: false ! En changeant cette valeur à true (ou en la commentant puisque par défaut elle est à true), ton formulaire devrait fonctionner de nouveau.

Et je te conseille d'utiliser cette méthode, c'est une très bonne pratique que d'utiliser la methode HTTP DELETE pour supprimer une ressource.

Bon courage !