Partage
  • Partager sur Facebook
  • Partager sur Twitter

Symfony 5.3.1 - Mauvaise route

Sujet résolu
Anonyme
5 juin 2021 à 22:49:29

Bonjour,

Je suis en train de me former à Symfony à l'aide de vidéos et j'essaie de reproduire un code. Le problème est que je rencontre un soucis concernant le routage des URL. Lorsque j'exécute la commande afficher les routes créées, j'obtiens ceci :

admin.property.edit        GET|POST   ANY      ANY    /admin/property/{id}               
admin.property.delete      DELETE     ANY      ANY    /admin/property/{id}   

Dans mon cas j'ai deux URL identiques qui correspondent à deux chemins différents, le choix se fait sur la méthode utilisée par le formulaire. Du côté de twig, voici mon code :

<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 type="submit" class="btn btn-danger">Supprimer</button>
</form>

Mon problème est que quand je clique sur le bouton "Supprimer" Symfony me redirige vers la page admin.property.edit au lieu de admin.property.delete. Cela fait maintenant un moment que j'écume les forums afin de trouver des solutions mais jusque là je n'ai rien trouvé de fonctionnel. Pour la précision, mes routes sont définies comme telle :

@Route("/admin/property/{id<\d+>}", name="admin.property.edit", methods="GET|POST")
@Route("/admin/property/{id<\d+>}", name="admin.property.delete", methods="DELETE")

Je souhaiterais donc recevoir de l'aide pour essayer de comprendre comme solutionner cela, par avance merci de vos retours.

Bonne soirée ;)

  • Partager sur Facebook
  • Partager sur Twitter
6 juin 2021 à 7:14:36

Bonjour,

On peut supposer que la route edit est définie avant delete d'où le problème.

Mes suggestions :

- définir autrement tes routes :

/admin/property/edit/{id} <==> property_edit et idem pour delete.

La notation avec un point dans le name n'est pas à mon avis très respectueuse des normes et l'underscore est préférable. Regarde d'ailleurs comment Symfony génère les routes si tu le fais avec le make:controller.

On peut supposer que l'édition et la suppression ne sont possible que par l'admin. Si oui ajouter admin dans le name n'apporte rien.

A+

  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
6 juin 2021 à 8:53:47

monkey3d a écrit:

Bonjour,

On peut supposer que la route edit est définie avant delete d'où le problème.

Mes suggestions :

- définir autrement tes routes :

/admin/property/edit/{id} <==> property_edit et idem pour delete.

La notation avec un point dans le name n'est pas à mon avis très respectueuse des normes et l'underscore est préférable. Regarde d'ailleurs comment Symfony génère les routes si tu le fais avec le make:controller.

On peut supposer que l'édition et la suppression ne sont possible que par l'admin. Si oui ajouter admin dans le name n'apporte rien.

A+

Bonjour,

Merci pour votre réponse rapide, votre solution fonctionne et je l'ai appliquée. J'ai créé mon controller à la main donc en effet je ne dois pas l'avoir fait de la manière la plus correcte qui soit. Cela veut donc dire qu'on ne peut pas faire deux routes différentes ayant la même URL mais avec une méthode différente ?

  • Partager sur Facebook
  • Partager sur Twitter
6 juin 2021 à 11:12:43

Salut

D'après la documentation, pour pouvoir utiliser le champ _method dans un formulaire et qu'il surcharge bien le verbe HTTP utilisé, il y aurait un réglage de symfony/framework-bundle qui gère ça. A mon avis il devrait être à true par défaut, mais ce n'est peut-être pas exactement le cas. Et si le mettre explicitement à true ne change rien, je pourrais penser que soit il y a un autre réglage ailleurs (au niveau du composant de formulaire ? le proxy de cache HTTP qui est probablement activé par défaut sur certaines piles serveur et qui, comme mentionné dans la documentation liée ci-cessus, peut poser problème ?) qui pose problème, soit on est dans un cas où il serait intéressant de remonter la chose aux développeurs de Symfony.

-
Edité par Ymox 6 juin 2021 à 11:16:47

  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
6 juin 2021 à 11:36:19

Merci @Ymox,

Ta proposition est bonne, j'ai essayé et ça a fonctionné. Je n'étais pas au courant pour l'ajout de 

Request::enableHttpMethodParameterOverride();

dans le fichier public/index.php, je pensais que Symfony gérait déjà ça en interne.

  • Partager sur Facebook
  • Partager sur Twitter
7 juin 2021 à 8:09:29

Normalement oui, ce que tu as fait n'est pas un réglage, mais une modification qui sera perdue à la mise à jour de Symfony.

  • Partager sur Facebook
  • Partager sur Twitter
25 octobre 2021 à 21:09:37

Je trouve qu'une façon un peu plus élégante serait de modifier la configuration dans config/packages/framework.yaml par défaut http_methode_override est a false mets le à true.
  • Partager sur Facebook
  • Partager sur Twitter
15 janvier 2022 à 9:52:34

Merci pour cette réponse. Elle résout le problème. En gros la solution idéal est de <<config/packages/framework.yaml par défaut http_methode_override est a false mets le à true.>>
  • Partager sur Facebook
  • Partager sur Twitter
15 janvier 2022 à 10:09:25

@PierreDegboevi Bonjour, pour dire merci pas la peine de déterrer un sujet vous avez la possibilité de cliquer sur les pouces levées des message qui vous ont aidés.

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

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter