Partage
  • Partager sur Facebook
  • Partager sur Twitter

Symfony - Method DELETE not allowed

Sujet résolu
13 janvier 2023 à 13:01:36

Bonjour,

J'ai 2 entités reliée entre elle Techno et Image. Dans le formulaire d'edit, j'affiche les images uploader avec à côté un lien supprimer qui appelle la fonction deleteImage dans mon controller. 

admin.yaml : (désolé YAML n'était pas présent dans la liste je ne savais pas quoi mettre comme extension)

delete.image:
  path: image/delete/{id}
  controller: App\Controller\Admin\Post\TechnoController::deleteImage
  methods: [DELETE]
  defaults:
    id: 0
  requirements:
    id: '[0-9]+'

TechnoController.php :

public function deleteImage(EntityManagerInterface $manager, Request $request, Image $image, ImageService $imageService): JsonResponse
    {

        $data = json_decode($request->getContent(), true);

        if ($this->isCsrfTokenValid('delete' . $image->getId(), $data['_token'])) {
            // Le token csrf est valide
            // On récupère le nom de l'iamage
            $name = $image->getName();

            if ($imageService->delete($name, 'technos', 300, 300)) {
                $manager->remove($image);
                $manager->flush();

                return new JsonResponse(['success' => true], 200);
            }
            // La suppression a échoué
            return new JsonResponse(['error' => 'Erreur de suppression'], 400);
        }

        return new JsonResponse(['error' => 'Token invalide'], 400);
    }

edit.html.twig :

{% if techno.image %}
     <h2>Images</h2>

     <div>
          <img src="{{ asset('assets/uploads/technos/mini/300x300-' ~ techno.image.name ) }}" alt="Image">
          <a href="{{ path('admin.delete.image', {id: techno.image.id}) }}" data-delete
          data-token="{{ csrf_token('delete' ~ techno.image.id) }}">Supprimer</a>
     </div>

{% endif %}


Cependant quand je clique sur supprimer :

J'ai l'erreur suivante :

J'ai suivis un tuto pour réaliser ceci et pour lui tout fonctionne, cependant il utilise le routing dans le controller, mais même en passant moi aussi par le controller, j'ai la même erreur. Je précise également que je n'utilise jamais method dans mes autres routes.

Merci d'avance à ceux qui sauront m'éclairer !

Tomi

  • Partager sur Facebook
  • Partager sur Twitter
13 janvier 2023 à 14:28:20

Salut

Quand tu accedes a un(ou une?) url en cliquant dessus la methode c'est GET. Si tu veux y acceder en DELETE tu devras faire une requete http et chosir comme methode DELETE

  • Partager sur Facebook
  • Partager sur Twitter
13 janvier 2023 à 14:39:49

Salut

Si vraiment tu souhaites utiliser DELETE, l'autre possibilité serait de faire du lien un formulaire avec un champ caché avec pour name _method et dont la valeur est DELETE — il n'y a pas moyen de mettre ce verbe dans l'attribut method du formulaire qui doit du coup être POST, la majorité sinon la totalité des navigateurs ne reconnaissent que deux valeurs pour cet attribut.

Il me semble aussi qu'il y a aussi un paramètre à activer pour pouvoir ainsi "surcharger" la méthode utilisée par le navigateur (c'est Symfony qui va gérer).

  • Partager sur Facebook
  • Partager sur Twitter
13 janvier 2023 à 15:21:43

Bonjour et merci pour votre réponse, je comprends votre raisonnement mais comment se fait-il que lui y parvienne?

Tuto

edit.html.twig

Controller avec fonction deleteImage

  • Partager sur Facebook
  • Partager sur Twitter
13 janvier 2023 à 15:27:30

A cause de ceci, très probablement.

-
Edité par Ymox 13 janvier 2023 à 15:27:45

  • Partager sur Facebook
  • Partager sur Twitter
13 janvier 2023 à 15:52:15

@Ymox et c'est dans ces moment qu'on se sent bête, j'avais aussi le fichier mais j'ai oublier de yarn watch du coup il était pas pris en compte, merci de ton aide :)
  • Partager sur Facebook
  • Partager sur Twitter
10 avril 2024 à 10:44:49

EN effet comme l'a bien dit @Ymox le verbe DELETE n'est pas souvent supporté par les navigateurs pour pouvoir le simuler il faut faire par exemple ceci :

 Notre action du controller 
 #[Route('/{id}', name: 'app_book_delete', methods: ['DELETE'])]
    public function delete(Request $request, Book $book, EntityManagerInterface $entityManager): Response
    {
        $entityManager->remove($book);

        $entityManager->flush();    
    }


Notre bouton supprimé de twig

<form method="post" action="{{ path('app_book_delete', {'id': book.id}) }}">
   
    <input type="hidden" name="_method" value="DELETE">

    <button class="btn btn-danger">Supprimé</button>
</form>

Pensez également à rajouter dans votre `config/packages/framework.yaml` la ligne suivante : 

# config/packages/framework.yaml

framework: # ... autres options http_method_override: true



-
Edité par sidi007 10 avril 2024 à 10:50:04

  • Partager sur Facebook
  • Partager sur Twitter
10 avril 2024 à 15:13:54

Bonjour,

Le message qui suit est une réponse automatique activée par un membre de l'équipe de modération. Les réponses automatiques leur permettent d'éviter d'avoir à répéter de nombreuses fois la même chose, ce qui leur fait gagner du temps et leur permet de s'occuper des sujets qui méritent plus d'attention.
Nous sommes néanmoins ouverts et si vous avez une question ou une remarque, n'hésitez pas à contacter la personne en question par Message Privé.

Pour plus d'informations, nous vous invitons à lire les règles générales du forum

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération
  • Partager sur Facebook
  • Partager sur Twitter

Pas d'aide concernant le code par MP, le forum est là pour ça :)