2013-06-05 2 views
3

Je voudrais générer une URL avec une méthode 'PUT' ou 'POST', via un lien <a href>.Symfony2 <a> lien avec la méthode 'post' ou 'delete' ou 'put'

Depuis que j'utilise un serveur côté cadre, j'utiliser un faux formulaire pour ce faire - par exemple avec la méthode PUT:

<form action="someActionUri" method="post"> 
     <input type="hidden" name="_method" value="PUT" /> 
     <input type="submit" value="GO PUT" /> 
</form> 

Mais, je voudrais utiliser un simple lien <a> :(

+0

Impossible de faire comme un lien et ce n'est pas spécifique à Symfony2, c'est comme ça que fonctionne HTTP. – Inoryy

+0

suffit de créer un formulaire avec un lien avec un "onclick" pour poster le formulaire –

Répondre

1

Dans le fichier de routage:

entity_edit: 
    pattern: /entity/{id}/edit 
    defaults: {_controller: MyBundle:Entity:put} 

Mon contrôleur (avec fosRest):

/** 
* @Rest\View() 
*/ 
public function putAction(Request $request, $id) 
{ 
...code ... 
} 

Mon TWIG:

<a href="{{ path('entity_edit', {'id': data.id}) }}" >Edition</a> 
4

Une ancre <a href="#"> utilisera toujours une requête GET. Il n'y a aucun moyen de modifier cela. Mais, il est possible de simuler une requête PUT ou DELETE en utilisant Symfony. Symfony Forms va truquer le verbe en ajoutant un champ caché aux formulaires.

<input type="hidden" name="_method" value="PUT" /> 

Ensuite, en interne, il vérifie si le verbe est POST, vérifie le paramètre _method et modifie le verbe POST du PUT. Cela fonctionne uniquement pour les formulaires HTML utilisant la méthode POST.

La même chose peut être faite pour les verbes GET, mais cela nécessite l'utilisation d'un écouteur d'événement. Voici un exemple:

use Symfony\Component\HttpKernel\Event\GetResponseEvent; 
use Symfony\Component\HttpKernel\HttpKernel; 

class VerbListener 
{ 
    public function onKernelRequest (GetResponseEvent $event) 
    { 
     $request = $event->getRequest(); 

     if (HttpKernel::MASTER_REQUEST === $event->getRequestType() 
       && $request->getMethod() === 'GET') 
     { 
      if ($request->query->get('_method') === 'PUT') { 
       $request->setMethod('PUT'); 
      } 
     } 
    } 
} 

Et le service doit être inscrit une priorité plus élevée que le service router_listener, qui correspond à la voie à un contrôleur.

services: 
    acme.verb.listener: 
     class: Acme\Bundle\Listener\VerbListener 
     tags: 
      - { name: kernel.event_listener, 
       event: kernel.request, 
       method: onKernelRequest, 
       priority: 100 } 

Le lien peut maintenant être généré avec le paramètre _method

<a href="foo?_method=PUT"></a> 
0

Même si j'aime réponse @twifty, je pense que c'est un peu exagéré d'écouter chaque demande simplement d'adapter certaines leur. Il est beaucoup plus simple à produire une forme au lieu de votre lien, donc au lieu de <a href="{{ path('my_route_with_put_method') }}">link</a>, vous pouvez simplement utiliser:

<form action="{{ path('my_route_with_put_method') }}" method="POST"> 
    <button>link</button> 
    <input type="hidden" name="_method" value="PUT"> 
</form> 

Vous avez juste besoin de faire attention, parce que vous utilisez un élément de bloc (form) au lieu de Un élément en ligne (a), mais vous pouvez facilement contourner cela (par exemple en incluant d'autres éléments dans le formulaire ou en utilisant CSS)

Questions connexes