J’ai récement mis à jour un projet pour passer de Symfony 2.1 à 2.2 et à ma grande surprise, toutes mes routes n’acceptant que des méthodes autres que POST ou GET, qui sont appelées via un formulaire utilisant le paramètre _method ne fonctionnaient plus… Voici un exemple de controller ne fonctionnant plus:
/** * @Route("/tickets/close", name="acme_demo_tickets_close") * @Method({"DELETE"}) */ public function ticketCloseAction() { // TODO: Some stuff... return array(); }
Ainsi que le formulaire associé :
<form action="{{ path('acme_demo_tickets_close') }}" method="post"> <input type="hidden" name="id" value="{{ ticket.id }}" /> <input type="hidden" name="_method" value="delete" /> <input type="hidden" name="_token" value="{{ csrf_token('ticket_close_' ~ ticket.id) }}" /> <input type="submit" value="Clore ce ticket" /> </form>
Lors du test, j’obtenais l’erreur suivante :
No route found for « POST /tickets/close »: Method Not Allowed (Allow: DELETE)
Mon premier réflexe fut d’aller voir le fichier UPGRADE-2.2 sur le dépôt officiel de Symfony, et là je vois cette ligne:
The _method request parameter support has been disabled by default (call Request::enableHttpMethodParameterOverride() to enable it).
Après plusieurs recherches et une bonne discussion sur le chat IRC #symfony-fr (je vous le recommande ! ;)), on a découvert que le fichier app.php et app_dev.php ont été modifiés suite à cette mise à jour. Plus précisément dans ce commit.
Oui mais voilà, si on a déjà un projet existant sous 2.1 et qu’on le passe sous 2.2, les fichiers app.php et app_dev.php ne changent pas, et la bim bam badaboum, ça ne marche plus ! :p
Donc pour régler le problème, il suffit d’appliquer la modification du commit sur vos propres fichiers respectifs et ça devrait normalement fonctionner. 🙂
Peut-être avez vous aussi découvert d’autres surprises en passant à la 2.2, n’hésitez pas à me le faire savoir ! 😉
P.S. : Notez que cet article est valable que pour la version 2.2 uniquement, il y aura un système de configuration à partir de la 2.3 pour l’override de la méthode.