我知道有人讨论在Symfony2中处理路由的最佳做法是什么(routing.yml vs annotations)。让我提一下,我希望保持原样,使用注释。
当我在控制器中为单个动作定义多个路径时,似乎@Method
注释的最后一个定义会覆盖所有其他路径,这就是为什么我会收到以下错误:
No route found for "POST /index": Method Not Allowed (Allow: GET, HEAD)
这只是我正在使用的一小段代码。
namespace MySelf\MyBundle\Controller;
use Symfony\Component\HttpFoundation\Response;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
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+
任何想法都是以使用注释来处理routing.yml的方式来实现它吗?
答案 0 :(得分:3)
您应该在每个路径注释中指定方法,@ Meethod只能声明一次。实际上,每种类型的注释都是分开处理的,它们并不是彼此都知道的。
/**
* @Route(
* "/index",
* name="index_default",
* methods="GET|POST"
* )
*
* @Route(
* "/index/{id}",
* name="index",
* requirements={
* "id": "\d+"
* },
* methods="GET"
* )
*
* @return Response
*/
答案 1 :(得分:0)
我认为可以两次声明@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的注释,它应该可以工作。