2015-04-17 47 views
1

我知道有什么是处理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?

+1

尝试直接在指定的路线标注方法(方法=“GET | POST”) – rpg600

+0

谢谢,这不正是我希望得到:)只要它张贴作为一个单独的答案,所以我可以勾选这:) :) – nTOXIC

回答

3

您应该在每个路由注释中指定方法,@Method只能声明一次。事实上,每种类型的注释都是分开处理的,它们并不知晓彼此。

/** 
* @Route(
*  "/index", 
*  name="index_default", 
*  methods="GET|POST" 
*) 
* 
* @Route(
*  "/index/{id}", 
*  name="index", 
*  requirements={ 
*   "id": "\d+" 
*  }, 
*  methods="GET" 
*) 
* 
* @return Response 
*/ 
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的注释,它应该工作。

+0

有可能宣布多条路线!我在一次操作中也使用了4条路线的注释,并且它们都按预期工作。剪切只是一个例子! – nTOXIC

+0

那么,我认为这是你想达到的目的吗?另外,为什么你需要多条路线来执行相同的操作?对我来说似乎没有必要。 –

+1

我会亲自拆分方法。有一个编程最佳实践指出:“一种方法应该只做一件事而且只做一件事”。考虑到这一点,你应该有一种方法来发布一个项目,一个用于索引,另一个用于阅读单个项目。 –