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)
*/
我正在使用 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)
*/