在Symfony2中路由

时间:2011-02-09 13:41:45

标签: php routing symfony

如何在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/...

10 个答案:

答案 0 :(得分:28)

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

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

default_route:
    pattern: /{url}
    defaults: { _controller: AcmeBundle:Default:index, url: "index" }
    requirements:
        url: ".+"

答案 1 :(得分:8)

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

答案 2 :(得分:8)

// Symfony2 PR10

在routing.yml中

default:
    pattern:  /{_controller}

它可以让您使用这种网址:http://localhost/MySuperBundle:MyController:myview

答案 3 :(得分: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)自动选择“格式”。

答案 4 :(得分: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-]+" 

答案 5 :(得分:2)

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

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

答案 6 :(得分:2)

创建默认路由不是一种好的编程方式。为什么?因为这个原因被实现了Exception。 Symfony2的构建只是为了以正确的方式做正确的事情。

如果要重定向所有“未找到”路由,则应使用异常,例如NotFound404或类似的东西。您甚至可以自己定制此页面。

一条路线是出于一个目的。总是。其他的想法很糟糕。

答案 7 :(得分:1)

您可以创建自己的包来处理所有请求,并使用URL参数构造一个字符串以传递给控制器​​的forward方法。但这非常糟糕,我会使用定义良好的路由,它可以使您的URL保持清洁,并将URL和控制器名称分离。如果您重命名捆绑包或其他内容,那么您是否必须重构您的URL?

答案 8 :(得分:1)

如果你想创造一个“全部捕获”,你最好的选择是挂钩KernelEvents::EXCEPTION事件。只要异常落入HttpKernel,就会触发此事件,这包括当路由器无法解析到Controller的路由时抛出的NotFoundHttpException

效果类似于Symfony的程式化404页面,当您通过app_dev.php发送请求时,该页面会被呈现。而不是返回404,你执行你正在寻找的任何逻辑。

答案 9 :(得分:0)

这取决于......我的一些看起来像这样:

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

有些看起来像

api_images:
path:     /images/{listingId}/{width}/{fileName}
defaults: { _controller: ApiBundle:Image:view, listingId: null, width: null, fileName: null }
methods:  [GET]
requirements:
    fileName: .+
相关问题