2013-06-05 29 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)

相关问题