【问题标题】:Symfony2 Controller Route clashSymfony2 控制器路由冲突
【发布时间】:2015-01-08 15:03:24
【问题描述】:

大家好,我对 Symfony2 中的根注释有点问题。

我有两个不同的控制器,它们从相同的 URL 位置 /test 调用方法。

控制器 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 时立即结束......?

我读过一些关于需求的东西,但不太理解这个概念

【问题讨论】:

    标签: php xml symfony


    【解决方案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})
    

    【讨论】:

      【解决方案2】:

      根据文档

      较早的路线总是赢

      这一切都意味着路线的顺序非常重要。 如果 blog_show 路由放置在 blog 路由之上,则 URL /blog/2 将匹配 blog_show 而不是 blog 因为 {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)
          {
             //.................
          }
      

      【讨论】:

        猜你喜欢
        • 2013-09-05
        • 2012-10-13
        • 1970-01-01
        • 2017-03-12
        • 2015-12-09
        • 1970-01-01
        • 1970-01-01
        • 2016-03-30
        • 2013-07-24
        相关资源
        最近更新 更多