我知道有人讨论在Symfony2中处理路由的最佳实践是什么(routeting.yml与注释)。让我提一下,我想保持原样,使用注释。
当我在控制器中为单个操作定义多个路由时,似乎@Method
注释的最后一个定义覆盖了所有其他定义,这就是我收到以下错误的原因:
No route found for "POST /index": Method Not Allowed (Allow: GET, HEAD)
这只是我正在使用的一小段代码。
namespace MySelfMyBundleController;
use SymfonyComponentHttpFoundationResponse;
use SensioBundleFrameworkExtraBundleConfigurationRoute;
use SensioBundleFrameworkExtraBundleConfigurationMethod;
class MyController extends Controller{
/**
* @Route(
* "/index",
* name="index_default"
* )
* @Method({"GET", "POST"})
*
* @Route(
* "/index/{id}",
* name="index",
* requirements={
* "id": "d+"
* }
* )
* @Method({"GET"})
*
* @return Response
*/
public function indexAction($id = null){
/*DO SOME FANCY STUFF*/
...
return $response;
}
}
虽然这工作得很好!
index_default:
pattern: /index
defaults: { _controller: MyBundle:MyController:index }
requirements:
_method: GET|POST
index:
pattern: /index/{id}
defaults: { _controller: MyBundle:MyController:index }
requirements:
_method: GET
id: d+
有什么想法可以改用注释与 routeting.yml 一起工作的方式来实现它吗?
您应该在每个路由注释中指定方法,@Method只能声明一次。事实上,每种类型的注释都是单独处理的,它们彼此不知道。
/**
* @Route(
* "/index",
* name="index_default",
* methods="GET|POST"
* )
*
* @Route(
* "/index/{id}",
* name="index",
* requirements={
* "id": "d+"
* },
* methods="GET"
* )
*
* @return Response
*/
不可能声明两次@route或@Method注释。您可以像这样为$id创建一个默认值:
/**
* @Route(
* "/index/{id}",
* name="index",
* requirements={
* "id": "d+"
* },
* defaults={"id" = null}
* )
*
* @Method({"GET", "POST"})
*
* @return Response
*/
public function indexAction($id)
{
/*DO SOME FANCY STUFF*/
...
return $response;
}
[编辑]好的,实际上可以在注释中声明多个路由。但是,我认为您不应该再次宣布@Method。我不确定这一点,但似乎这个:
@Method({"GET"})
正在覆盖以下内容:
@Method({"GET", "POST"})
当您覆盖它时,您只剩下 GET。删除仅声明 GET 的注释,它应该可以工作。