Usare i metodi HTTP oltre a GET e POST nelle rotte

Il metodo HTTP di una richiesta è uno dei requisiti verificabili per la corrispondenza a una rotta. L’argomento è trattato nella capitolo sulle rotte del libro, “Le rotte”, con esempi che usano GET e POST. Ma si possono usare anche altri metodi HTTP in questo modo. Per esempio, se si ha una rotta relativa a un post di un blog, si può usare lo stesso schema di URL per mostrarlo, aggiornarlo e cancellarlo, cercando corrispondenza con GET, PUT e DELETE.

  • YAML
    blog_show:
        path:     /blog/{slug}
        defaults: { _controller: AppBundle:Blog:show }
        methods:  [GET]
    
    blog_update:
        path:     /blog/{slug}
        defaults: { _controller: AppBundle:Blog:update }
        methods:  [PUT]
    
    blog_delete:
        path:     /blog/{slug}
        defaults: { _controller: AppBundle:Blog:delete }
        methods:  [DELETE]
    
  • XML
    <?xml version="1.0" encoding="UTF-8" ?>
    
    <routes xmlns="http://symfony.com/schema/routing"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">
    
        <route id="blog_show" path="/blog/{slug}" methods="GET">
            <default key="_controller">AppBundle:Blog:show</default>
        </route>
    
        <route id="blog_update" path="/blog/{slug}" methods="PUT">
            <default key="_controller">AppBundle:Blog:update</default>
        </route>
    
        <route id="blog_delete" path="/blog/{slug}" methods="DELETE">
            <default key="_controller">AppBundle:Blog:delete</default>
        </route>
    </routes>
    
  • PHP
    use Symfony\Component\Routing\RouteCollection;
    use Symfony\Component\Routing\Route;
    
    $collection = new RouteCollection();
    $collection->add('blog_show', new Route('/blog/{slug}', array(
        '_controller' => 'AppBundle:Blog:show',
    ), array(), array(), '', array(), array('GET')));
    
    $collection->add('blog_update', new Route('/blog/{slug}', array(
        '_controller' => 'AppBundle:Blog:update',
    ), array(), array(), '', array(), array('PUT')));
    
    $collection->add('blog_delete', new Route('/blog/{slug}', array(
        '_controller' => 'AppBundle:Blog:delete',
    ), array(), array(), '', array('DELETE')));
    
    return $collection;
    

Finti metodi con _method

Nota

La funzionalità _method mostrata qui è disabilitata in Symfony 2.2 e abilitata in Symfony 2.3. Per abilitarla in Symfony 2.2, occorre richiamare il metodo Request::enableHttpMethodParameterOverride prima di gestire la richiesta (p.e. nel front controller). In Symfony 2.3, usare l’opzione http_method_override.

Sfortunatamente, la vita non è così facile, poiché molti browser non supportano l’invio di richieste PUT e DELETE. Per fortuna, Symfony fornisce un semplice modo per aggirare tale limitazione. Includendo un parametro _method nella query string o nei parametri di una richiesta HTTP, Symfony lo userà come metodo nella corrispondenza delle rotte. I form includono automaticamente un campo nascosto per tale parametro, se il metodo di invio non è GET o POST. Vedere il capitolo relativo nella documentazione dei form per maggiori informazioni.

Tabella dei contenuti

Argomento precedente

Configurare un rinvio senza controllori ad hoc

Argomento successivo

Usare i parametri del contenitore di servizi nelle rotte

Questa pagina