【问题标题】:Symfony 3 - Route excluding beginning of specific path (url)Symfony 3 - 不包括特定路径开头的路由(url)
【发布时间】:2018-01-13 20:27:27
【问题描述】:

我正在使用 Symfony 3.2.9 创建一个应用程序,我想做一个管理面板来管理应用程序。应用程序像 CMS 一样工作,因此使用 URL 创建新页面,如 domain.com/pagename1 和 domain.com/pagename1/subpagelevel2 等。问题是当我想为管理面板创建 URL 时,URL 应该看起来像:domain.com/admin,但管理面板也需要一些子页面,比如 domain.com/admin/manage 或 domain.com/admin/manage/编辑/1 等。

我使用如下路由创建了 DefaultController:

/**
 * @Route("/", name="homepage")
 */

和带有路由的 AdminController 如下:

/**
 * @Route("/admin", name="admin")
 */

问题是当我想动态创建应用程序的新子页面时,我需要创建如下路由:

/**
 * @Route("/{page}")
 */

但这会覆盖我的管理面板子页面(例如 domain.com/admin/manage)。

是否可以通过 AdminController 从默认的 DefaultController 中排除或覆盖路径?我希望能够从 DefaultController 创建所有 URL-s,但以 domain.com/admin ... 等开头的路径除外。

【问题讨论】:

    标签: php symfony model-view-controller routes symfony-3.2


    【解决方案1】:

    https://symfony.com/doc/current/routing.html 的文档中,您可以使用requirements 参数指定更严格的匹配

    我想这样的事情会起作用:

    默认控制器:

    /**
     * @Route("/", name="homepage")
     */
    

    管理员控制器:

    /**
     * @Route("/admin", name="admin")
     */
    

    其他控制器:

    /**
     * we exclude page=admin from this controller
     * @Route("/{page}", requirements={"page": "^(?!admin).+"}))
     */
    

    【讨论】:

      【解决方案2】:

      路由按照它们列出的顺序进行搜索 - 所以将最通用的放在列表末尾,它会在 /{page} 之前找到并使用 /admin

      例如,我在 app/conf/routing.yml 底部的最后一条路由是

      # http://symfony.com/doc/current/routing/redirect_trailing_slash.html
      remove_trailing_slash:
          path: /{url}
          defaults:
              _controller: AppBundle:Default:removeTrailingSlash
          requirements:
              url: .*/$
          methods: [GET]
      

      【讨论】:

      • 感谢您的帮助。我修改了 routing.yml 文件,现在看起来像:admin_show: path: /admin/{slug} defaults: { _controller: AppBundle:Admin:index } page_show: path: /{slug} defaults: { _controller: AppBundle:Default:index } 我得到“找不到...的路线”,我的代码有问题吗?也许我应该在控制器上方的@Route 中更改某些内容? /** * @Route("/", name="cms") */
      • 如果您只想使用 @Route 注释,您需要从 .yml 中删除 path 定义并放入 resource: @bundle-path/.../...Controller.php 以便路由系统使用它们。跨度>
      【解决方案3】:

      在您的用例中最干净:

      为什么不简单地为 Admin 创建一个单独的 Bundle 并在 AdminBundle 路由中放置一个前缀?

      不建议在路由中依赖路由顺序和/或 REGEX 来避免创建捆绑包。这是 Bundles 的想法。

      app/config/routing.yml

      admin:
        resource: "@AdminBundle/Controller/"
        type:     annotation
        prefix:   /admin
      

      然后,AdminBundle 下的所有控制器/路由都将在 /admin 前缀下工作。

      例如,IndexController/DefaultController/WhatEverController 在 AdminBundle 中带有此路由:

       /**
       * @Route("/")
       */
      public function indexAction()
      {
          //My code
      }
      

      将匹配“/admin”而不是“/”

      还有:

       /**
       * @Route("/{page}")
       */
      public function indexAction()
      {
          //My code
      }
      

      将匹配“/admin/{page}”而不是“/{page}”

      【讨论】:

        【解决方案4】:

        从 Symfony 5.1 开始,你可以定义 route priority

        /**
         * @Route("/admin", name="admin", priority=10)
         */
        
        /**
         * @Route("/{slug}", name="pages", priority=99)
         */
        

        【讨论】:

          猜你喜欢
          • 2020-06-10
          • 1970-01-01
          • 2021-12-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-01
          • 1970-01-01
          相关资源
          最近更新 更多