我想生成一个带有“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>
链接:(
答案 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)