Php Symfony2控制器路线冲突

Php Symfony2控制器路线冲突,php,xml,symfony,Php,Xml,Symfony,嘿,我对Symfony2中的根注释有点问题 我有两个不同的控制器,它们从相同的URL位置/测试调用方法 控制器1: ** * @Route("/test", service="myProject.test.controller.art") * @Cache(expires="+5 minutes", public=true) */ class BlogController { /** * @Route("/{t

嘿,我对Symfony2中的根注释有点问题

我有两个不同的控制器,它们从相同的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时立即结束吗


我读了一些关于需求的东西,但根据文档,我不理解这个概念

早期路线总是赢的

这一切都意味着路线的顺序非常重要。 如果blog_show路由位于blog路由之上,则URL /blog/2将匹配blog_show而不是blog,因为{slug} blog_show的参数没有要求。通过使用适当的顺序 和聪明的需求,你可以完成任何事情

我建议使用yml或xml文件进行路由 或者你可以在第一条路线上提出要求

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

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

路由器将使用与路径匹配的第一条路由

将一条路线优先于另一条可能匹配的路线的唯一方法是确保在较弱的要求之前检查更严格的要求

通常,这可以通过将
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})