Tutos & Astuces

Migration Symfony 2.1 à 2.2 : Attention au paramètre _method !

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...

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.

Share on Facebook0Tweet about this on TwitterShare on Google+0Share on LinkedIn0
  • meeyo

    Salut!

    Merci pour ton astuce. Mais malgré le fait que mon app.php et mon app_dev.php aient été modifiés, j’ai toujours une erreur du type  »

    No route found for « GET /admin/enseigne/2/delete »: Method Not Allowed (Allow: POST, DELETE) »

    mon app_dev.php:

    $kernel = new AppKernel(‘dev’, true);
    $kernel->loadClassCache();
    Request::enableHttpMethodParameterOverride();
    $request = Request::createFromGlobals();
    $response = $kernel->handle($request);
    $response->send();
    $kernel->terminate($request, $response);

    Aurais-tu une idée?

    Merci d’avance.

    Sam

  • Noneslad

    Merci un million de fois !!!!

    Pour ma part je suis sous la version 2.3.4 et tout marche bien en dev ! et quand je passe en prod, impossible d’exécuter les actions requérant une put ou delete avec cette astuce mon environnement de prod est opérationnel Merci encore !