Symfony2 <a> link with &#39;post&#39; or &#39;delete&#39; or &#39;put&#39; method</a>

时间:2013-06-05 08:42:08

标签: symfony post hyperlink put http-method

我想生成一个带有“PUT&#39;”的网址。或者&#39; POST&#39;方法要求,通过<a href>链接。

由于我使用框架服务器端,我使用假表单来执行此操作 - 使用PUT方法的示例:

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

但是,我想使用一个简单的<a>链接:(

3 个答案:

答案 0 :(得分:5)

<a href="#">将始终使用GET请求。没有办法修改它。但是,可以使用Symfony伪造PUT或DELETE请求。

Symfony Forms会通过向表单添加隐藏字段来伪造动词。

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

然后在内部检查动词是否为POST,检查_method参数并将动词从POST更改为PUT。这仅适用于使用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>

答案 1 :(得分:1)

在路由文件中:

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

我的控制器(使用fosRest):

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

我的TWIG:

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

答案 2 :(得分:0)

即使我喜欢@twifty响应,我认为听取每一个请求只是为了适应其中一些是有点过分。 输出表单而不是链接要简单得多,因此您可以简单地使用:{/ p>而不是<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)