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.




