如何在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/...
答案 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
和三个选项参数defaults
,requirements
和options
。
这是我自己项目的路线:
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: .+