Symfony 3 - 路由不包括特定路径的开头(url)

Symfony 3 - Route excluding beginning of specific path (url)

我正在使用 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/edit/1 等。

我创建了 DefaultController,路由如下:

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

和 AdminController 的路由如下:

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

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

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

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

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

路由按列出的顺序搜索 - 所以将最通用的放在列表的末尾,它会在 /{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]

根据 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).+"}))
 */

您的用例最清晰:

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

取决于路由顺序 and/or 不建议在路由中使用 REGEX 只是为了避免创建 Bundle。这就是 Bundle 的想法。

app/config/routing.yml

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

那么,AdminBundle下的所有controllers/routes都会在/admin前缀下工作。

例如,IndexController/DefaultController/WhatEverController 在 AdminBundle 中使用此路由:

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

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

并且:

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

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

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

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

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