.. index::
single: Routing; methods
How to use HTTP Methods beyond GET and POST in Routes
=====================================================
The HTTP method of a request is one of the requirements that can be checked
when seeing if it matches a route. This is introduced in the routing chapter
of the book ":doc:`/book/routing`" with examples using GET and POST. You can
also use other HTTP verbs in this way. For example, if you have a blog post
entry then you could use the same URL path to show it, make changes to it and
delete it by matching on GET, PUT and DELETE.
.. configuration-block::
.. code-block:: yaml
blog_show:
path: /blog/{slug}
defaults: { _controller: AcmeDemoBundle:Blog:show }
methods: [GET]
blog_update:
path: /blog/{slug}
defaults: { _controller: AcmeDemoBundle:Blog:update }
methods: [PUT]
blog_delete:
path: /blog/{slug}
defaults: { _controller: AcmeDemoBundle:Blog:delete }
methods: [DELETE]
.. code-block:: xml
AcmeDemoBundle:Blog:show
AcmeDemoBundle:Blog:update
AcmeDemoBundle:Blog:delete
.. code-block:: php
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\Route;
$collection = new RouteCollection();
$collection->add('blog_show', new Route('/blog/{slug}', array(
'_controller' => 'AcmeDemoBundle:Blog:show',
), array(), array(), '', array(), array('GET')));
$collection->add('blog_update', new Route('/blog/{slug}', array(
'_controller' => 'AcmeDemoBundle:Blog:update',
), array(), array(), '', array(), array('PUT')));
$collection->add('blog_delete', new Route('/blog/{slug}', array(
'_controller' => 'AcmeDemoBundle:Blog:delete',
), array(), array(), '', array('DELETE')));
return $collection;
Faking the Method with _method
------------------------------
.. note::
The ``_method`` functionality shown here is disabled by default in Symfony 2.2
and enabled by default in Symfony 2.3. To control it in Symfony 2.2, you
must call :method:`Request::enableHttpMethodParameterOverride `
before you handle the request (e.g. in your front controller). In Symfony
2.3, use the :ref:`configuration-framework-http_method_override` option.
Unfortunately, life isn't quite this simple, since most browsers do not
support sending PUT and DELETE requests. Fortunately Symfony2 provides you
with a simple way of working around this limitation. By including a ``_method``
parameter in the query string or parameters of an HTTP request, Symfony2 will
use this as the method when matching routes. Forms automatically include a
hidden field for this parameter if their submission method is not GET or POST.
See :ref:`the related chapter in the forms documentation`
for more information.