Symfony2 <a>与'post'或'delete'或'put'方法链接

Pim*_*Web 3 post put hyperlink http-method symfony

我想通过链接生成一个带有"PUT"或"POST"方法要求的网址<a href>.

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

<form action="someActionUri" method="post">
      <input type="hidden" name="_method" value="PUT" />
      <input type="submit" value="GO PUT" />
</form>
Run Code Online (Sandbox Code Playgroud)

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

Twi*_*fty 5

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

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

<input type="hidden" name="_method" value="PUT" />
Run Code Online (Sandbox Code Playgroud)

然后在内部检查动词是否为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' );
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并且必须以比router_listener服务更高的优先级注册服务,该服务与到控制器的路由匹配.

services:
    acme.verb.listener:
        class: Acme\Bundle\Listener\VerbListener
        tags:
            - { name: kernel.event_listener,
                event: kernel.request,
                method: onKernelRequest,
                priority: 100 }  
Run Code Online (Sandbox Code Playgroud)

现在可以使用_method参数生成链接

<a href="foo?_method=PUT"></a>
Run Code Online (Sandbox Code Playgroud)