问问题
5045 次
3 回答
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>
于 2015-02-05T17:18:47.980 回答
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>
于 2013-09-26T21:35:13.647 回答
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)
于 2017-11-01T10:19:21.120 回答