25

如何在 Symfony2 中设置默认路由?

在 Symfony1 中,它看起来像这样:

homepage:
  url:   /
  param: { module: default, action: index }

default_symfony:
  url:   /symfony/:action/...
  param: { module: default }

default_index:
  url:   /:module
  param: { action: index }

default:
  url:   /:module/:action/...
4

10 回答 10

28

我正在翻阅食谱寻找答案,并认为我在这里找到了它。默认情况下,所有路由参数都有一个隐藏的要求,即它们匹配/ 字符 ([^/]+) 之外的任何字符,但可以使用 requirements 关键字覆盖此行为,强制它匹配任何字符。

以下应该创建一个捕获所有其他路由的默认路由 - 因此,应该在您的路由配置中排在最后,因为任何后续路由都不会匹配。为了确保它也匹配“/”,包含了 url 参数的默认值。

default_route:
    pattern: /{url}
    defaults: { _controller: AcmeBundle:Default:index, url: "index" }
    requirements:
        url: ".+"
于 2011-10-25T15:50:43.223 回答
8

// Symfony2 PR10

在 routing.yml 中:

default:
    pattern:  /{_controller}

它使您能够使用这种 url:http://localhost/MySuperBundle:MyController:myview

于 2011-04-09T16:10:57.810 回答
8

我认为标准路由组件不可能。看看这个捆绑包,它可能会有所帮助: https ://github.com/hidenorigoto/DefaultRouteBundle

于 2011-02-25T10:47:03.350 回答
4

Symfony2 标准路由组件不支持它,但是这个包填补了 Symfony1 留下的空白:

https://github.com/LeaseWeb/LswDefaultRoutingBundle

它做你所期望的。您可以使用以下语法默认路由捆绑包:

FosUserBundle:
  resource: "@FosUserBundle"
  prefix:   /
  type:     default

它会扫描您的包并自动将路由添加到您可以通过执行调试的路由器表:

app/console router:debug

自动添加的默认路由示例:

[router] Current routes
Name                          Method Pattern
fos_user.user.login_check     ANY    /user/login_check.{_format}
fos_user.user.logout          ANY    /user/logout.{_format}
fos_user.user.login           ANY    /user/login.{_format}
...

您会看到它还通过使用文件扩展名(html、json 或 xml)支持自动“格式”选择。

于 2013-01-27T23:34:22.440 回答
3

这是一个例子:http ://docs.symfony-reloaded.org/master/quick_tour/the_big_picture.html#routing

一个路由定义只有一个强制参数pattern和三个可选参数defaultsrequirementsoptions

这是我自己项目的路线:

video:
    pattern:  /watch/{id}/{slug}
    defaults: { _controller: SiteBundle:Video:watch }
    requirements: { id: "\d+", slug: "[\w-]+" 
于 2011-02-09T13:57:07.267 回答
2

或者,您可以直接在控制器文件中使用 @Route 注释。见https://github.com/sensio/SensioFrameworkExtraBundle/blob/master/Resources/doc/annotations/routing.rst

至于默认路由,我认为 Symfony2 鼓励显式路由映射。

于 2011-07-10T19:00:01.167 回答
2

创建默认路由不是一种好的编程方式。为什么?因为这个原因被执行了异常。Symfony2 旨在以正确的方式做正确的事情。

如果你想重定向所有“未找到”的路由,你应该使用异常,比如 NotFound404 或类似的东西。您甚至可以自行自定义此页面。

一条路线是为了一个目的。总是。别人觉得不好。

于 2011-12-19T14:57:07.173 回答
1

您可以创建自己的包来处理所有请求并使用 URL 参数构造一个字符串以传递给控制器​​的 forward 方法。但这很糟糕,我会使用定义明确的路由,它可以让你的 URL 更干净,并且将 URL 和控制器名称解耦。如果您重命名捆绑包或其他内容,那么您是否必须重构您的 URL?

于 2011-09-27T21:04:39.417 回答
1

如果你想创建一个“包罗万象”,你最好的选择是抓住这个KernelEvents::EXCEPTION事件。每当异常落入时触发此事件HttpKernel,这包括NotFoundHttpException当路由器无法解析到控制器的路由时引发的。

效果类似于 Symfony 的风格化 404 页面,当您通过 app_dev.php 发送请求时会呈现该页面。您无需返回 404,而是执行您想要的任何逻辑。

于 2013-01-10T00:29:20.717 回答
0

It depends... Some of mine look like this:

api_email:
resource: "@MApiBundle/Resources/config/routing_email.yml"
prefix: /

and some look like

api_images:
path:     /images/{listingId}/{width}/{fileName}
defaults: { _controller: ApiBundle:Image:view, listingId: null, width: null, fileName: null }
methods:  [GET]
requirements:
    fileName: .+
于 2018-04-05T07:07:04.517 回答