2013-06-05 74 views
3

我想通過<a href>鏈接生成帶有「PUT」或「POST」方法要求的網址。Symfony2 <a>鏈接'post'或'delete'或'put'方法

由於我使用了一個框架服務器端,我用一個假的形式來做到這一點 - 例如用PUT方法:

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

不過,我想用一個簡單的<a>鏈接:(

+0

不可能做爲鏈接,它不是特定於Symfony2,它是HTTP的工作原理。 – Inoryy

+0

只需創建一個帶有「onclick」鏈接的表單來發布表單 –

回答

1

在路由文件:

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

我的控制器(帶fosRest):

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

我的嫩枝:

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

<a href="#">總是使用GET請求。沒有辦法修改它。但是,可以使用Symfony僞造PUT或DELETE請求。

Symfony Forms會通過向表單添加隱藏字段來僞造動詞。

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

然後在內部它檢查動詞是POST,將檢查_method參數和改變從POST動詞放。這僅適用於使用POST方法的HTML表單。

對GET動詞也可以做同樣的事情,但它需要使用事件監聽器。下面是一個例子:

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'); 
      } 
     } 
    } 
} 

而服務必須與比router_listener服務,該服務的路由相匹配到控制器的更高的優先級被登記。

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

該鏈接現在可以與_method參數

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

即使我喜歡@twifty反應生成,我認爲這是一個有點矯枉過正傾聽每一個請求只是爲了適應一些他們。 這是更簡單的輸出形式,而不是你的鏈接,所以不是<a href="{{ path('my_route_with_put_method') }}">link</a>,你可以簡單地使用:

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

你只需要注意的是,由於您使用的是塊元素(form)代替一個內聯元素(a),但你可以輕鬆地繞過它(例如包括表單內的其他內聯元素或使用CSS)

相關問題