2015-01-08 3 views
1

Привет всем, у меня есть проблема с корневыми аннотациями в Symfony2.Symfony2 Controller Route clash

У меня есть два разных контроллера, которые вызывают методы с одинаковых позиций/тестов URL.

Контроллер 1:

** 
    * @Route("/test", service="myProject.test.controller.art") 
    * @Cache(expires="+5 minutes", public=true) 
    */ 
    class BlogController 
    { 

     /** 
     * @Route("/{text}", defaults={"text" = null}) 
     * @Route("/topic/{tag}", defaults={"tag" = null}) 
     * @Method({"GET"}) 

     */ 
     public function listAction(ArtQuery $query) 
     { 
      //................. 
     } 
    } 

Контроллер 2:

** 
* @Route("/test" , service="myProject.test.controller.sitemap")) 
* @Cache(expires="+5 minutes", public=true) 
*/ 
class SitemapController 
{ 
/** 
    * @Route("/sitemap.xml/") 
    * @Method({"GET"}) 
    */ 
    public function sitemapAction() 
    { 
     //.................. 
    } 
} 

Проблема заключается в том, что второй контроллер никогда не соответствует, только если добавить в мой @route("/sitemap.xml/"), но я действительно хочу, чтобы маршрут быть только @route("/sitemap.xml").

Я думаю, что проблема заключается в том, когда я ввожу url /test/sitemap.xml Symfony рассматривает файл sitemap.xml как/{text} переменный маршрут в первом контроллере.

Могу ли я сделать исключение, так что первый контроллер заканчивается, как только он нажимает sitemap.xml ....?

я прочитал кое-что о требованиях но не тихо понять эту концепцию

ответ

1

согласно документации

Ранее Маршруты всегда Win

Что это все означает, что порядок маршрутов очень важно , Если маршрут blog_show был размещен над маршрутом блога, URL-адрес /blog/2 будет соответствовать blog_show вместо блога, так как параметр {slug} blog_show не имеет требований. Используя надлежащий порядок и умные требования, вы можете выполнить практически все.

http://symfony.com/doc/current/book/routing.html

я предлагаю использовать YML или файл XML для маршрутизации или вы можете сделать требование в первом маршруте

/** 
    * @Route("/{text}", defaults={"text" = null}, requirements={"text" = "^(?!sitemap\.xml)$"}) 
    * @Route("/topic/{tag}", defaults={"tag" = null}) 
    * @Method({"GET"}) 

    */ 
    public function listAction(ArtQuery $query) 
    { 
     //................. 
    } 
1

Маршрутизатор будет использовать первый маршрут, который соответствует пути ,

Единственный способ определить приоритет маршрута над другим, который может совпадать, - это убедиться, что более строгие требования проверяются перед более слабыми.

Обычно это должно быть выполнено путем установки метода sitemapAction выше listAction. Однако, поскольку у вас есть контроллер для каждого из них, вам нужно будет установить контроллеры в правильном порядке.

Для этого вам нужно будет добавить контроллеры в конфигурации по отдельности, как это:

app_sitemap: 
    resource: "@AppBundle/Controller/SitemapController.php" 
    type:  annotation 
    prefix: /


app_blog: 
    resource: "@AppBundle/Controller/BlogController.php" 
    type:  annotation 
    prefix: /

Таким образом, контроллеры будут итерированным в этом порядке.

Однако лучше, если вы можете дать каждому маршруту уникальный путь, возможно:

@Route("/query/{text}", defaults={"text" = null}) 
Смежные вопросы