Route @Method 注释在匹配路由时似乎没有得到尊重
Route @Method annotation doesn't seem to get respected when matching routes
我理解在允许类似的可访问路线时,路线的顺序很重要。
我感到困惑的是,为什么向这条路线提交 DELETE
请求时,它是否与 GET
路线匹配,而不是忽略它并尝试下面的匹配方法?
/**
* @Route("/{game}")
* @Method({"GET"})
*/
public function single(Request $request, GameSerializer $gameSerializer, Game $game) {
$out = $gameSerializer->bind($game);
return new JsonResponse($out);
}
/**
* @Route("/{game}")
* @Method({"DELETE"})
*/
public function remove(Request $request, Game $game) {
$em = $this->getDoctrine()->getManager();
$em->remove($game);
$em->flush();
return new JsonResponse([], 200);
}
完全公开
我明白为什么它根据严格的模式匹配最上面的路由
我不理解为什么访问方法在这样做时被忽略
所以,为了测试,我调整了将基于 DELETE
的路线向上移动到 GET
路线
之上
/**
* @Route("/{game}")
* @Method({"DELETE"})
*/
public function remove(Request $request, Game $game) {
$em = $this->getDoctrine()->getManager();
$em->remove($game);
$em->flush();
return new JsonResponse([], 200);
}
/**
* @Route("/{game}")
* @Method({"GET"})
*/
public function single(Request $request, GameSerializer $gameSerializer, Game $game) {
$out = $gameSerializer->bind($game);
return new JsonResponse($out);
}
只有..当我尝试通过在浏览器中执行访问url的基本操作来获取现有的非测试记录时才会发生这种情况(因此,GET
)
天啊,它有没有删除那条记录。
为什么访问方法被忽略了?
首先,请注意您使用的 SensioFrameworkExtraBundle 版本,因为来自 SensioFrameworkExtraBundle[=24= 的 @Method
注释] 在最新版本中已被 删除 。相反,Symfony @Route 注释定义了一个方法选项来限制路由的 HTTP 方法:
*
* @Route("/show/{id}", methods={"GET","HEAD"})
*
但在您的情况下,如果您使用的是 HTML 表单和 HTTP 方法而不是 GET 和 POST,则需要包括一个 _method 参数来伪造 HTTP 方法。
See How to Change the Action and Method of a Form for more information.
我认为你必须添加路由名称并且它必须是唯一的。
尝试以下方式:
/**
* @Route("/{game}",name="api_remove")
* @Method({"DELETE"})
*/
public function remove(Request $request, Game $game) {
...
}
/**
* @Route("/{game}",name="single_remove")
* @Method({"GET"})
*/
public function single(Request $request, GameSerializer $gameSerializer, Game $game) {
...
}
我理解在允许类似的可访问路线时,路线的顺序很重要。
我感到困惑的是,为什么向这条路线提交 DELETE
请求时,它是否与 GET
路线匹配,而不是忽略它并尝试下面的匹配方法?
/**
* @Route("/{game}")
* @Method({"GET"})
*/
public function single(Request $request, GameSerializer $gameSerializer, Game $game) {
$out = $gameSerializer->bind($game);
return new JsonResponse($out);
}
/**
* @Route("/{game}")
* @Method({"DELETE"})
*/
public function remove(Request $request, Game $game) {
$em = $this->getDoctrine()->getManager();
$em->remove($game);
$em->flush();
return new JsonResponse([], 200);
}
完全公开
我明白为什么它根据严格的模式匹配最上面的路由
我不理解为什么访问方法在这样做时被忽略
所以,为了测试,我调整了将基于 DELETE
的路线向上移动到 GET
路线
/**
* @Route("/{game}")
* @Method({"DELETE"})
*/
public function remove(Request $request, Game $game) {
$em = $this->getDoctrine()->getManager();
$em->remove($game);
$em->flush();
return new JsonResponse([], 200);
}
/**
* @Route("/{game}")
* @Method({"GET"})
*/
public function single(Request $request, GameSerializer $gameSerializer, Game $game) {
$out = $gameSerializer->bind($game);
return new JsonResponse($out);
}
只有..当我尝试通过在浏览器中执行访问url的基本操作来获取现有的非测试记录时才会发生这种情况(因此,GET
)
天啊,它有没有删除那条记录。
为什么访问方法被忽略了?
首先,请注意您使用的 SensioFrameworkExtraBundle 版本,因为来自 SensioFrameworkExtraBundle[=24= 的 @Method
注释] 在最新版本中已被 删除 。相反,Symfony @Route 注释定义了一个方法选项来限制路由的 HTTP 方法:
*
* @Route("/show/{id}", methods={"GET","HEAD"})
*
但在您的情况下,如果您使用的是 HTML 表单和 HTTP 方法而不是 GET 和 POST,则需要包括一个 _method 参数来伪造 HTTP 方法。
See How to Change the Action and Method of a Form for more information.
我认为你必须添加路由名称并且它必须是唯一的。
尝试以下方式:
/**
* @Route("/{game}",name="api_remove")
* @Method({"DELETE"})
*/
public function remove(Request $request, Game $game) {
...
}
/**
* @Route("/{game}",name="single_remove")
* @Method({"GET"})
*/
public function single(Request $request, GameSerializer $gameSerializer, Game $game) {
...
}