Php Symfony2中的路由
如何在Symfony2中设置默认路由 在Symfony1中,它看起来像这样:Php Symfony2中的路由,php,routing,symfony,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
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/...
以下是一个例子:
路线定义只有一个必需参数<代码>模式和三个可选参数<代码>默认值,<代码>要求和<代码>选项
以下是我自己项目的路线:
video:
pattern: /watch/{id}/{slug}
defaults: { _controller: SiteBundle:Video:watch }
requirements: { id: "\d+", slug: "[\w-]+"
我认为使用标准路由组件是不可能的。 看看这个捆绑包,它可能会有帮助: //Symfony2 PR10 在routing.yml中:
default:
pattern: /{_controller}
它允许您使用此类URL:或者,您可以直接在控制器文件中使用@Route注释。看
至于默认路由,我认为Symfony2鼓励显式路由映射。您可以创建自己的包来处理所有请求,并使用URL参数构造字符串以传递给控制器的转发方法。但这太糟糕了,我会选择定义良好的路由,它会让你的URL更干净,并将URL和控制器名称解耦。如果你重命名了一个捆绑包或其他东西,那么你需要重构你的URL吗?我在查阅烹饪书寻找答案,我想我已经找到了。默认情况下,所有路由参数都有一个隐藏的要求,即它们匹配除/character([^/]+)之外的任何字符,但可以使用requirements关键字覆盖此行为,方法是强制它匹配任何字符 下面应该创建一个捕获所有其他路由的默认路由-因此,在路由配置中应该排在最后,因为下面的任何路由都不会匹配。为了确保它也与“/”匹配,包含url参数的默认值
default_route:
pattern: /{url}
defaults: { _controller: AcmeBundle:Default:index, url: "index" }
requirements:
url: ".+"
创建默认路由不是一种好的编程方式。为什么?因为这个原因,实现了异常。 Symfony2的构建就是为了以正确的方式做正确的事情 如果您想重定向所有“未找到”路由,您应该使用异常,比如NotFound404或类似的东西。你甚至可以自己定制这个页面 一条路线只有一个目的。总是。其他的想法是不好的。如果你想创建一个“包罗万象”,你最好的办法就是钩住
KernelEvents::EXCEPTION
事件。每当异常到达HttpKernel
时,就会触发此事件,这包括当路由器无法解析到控制器的路由时抛出的NotFoundHttpException
其效果类似于Symfony的404样式化页面,当您通过app_dev.php发送请求时会呈现该页面。您不返回404,而是执行所需的任何逻辑。Symfony2标准路由组件不支持它,但此捆绑包填补了Symfony1留下的空白: 它符合你的期望。您可以使用以下语法默认路由捆绑包:
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)支持自动“格式”选择。。。我的一些作品是这样的:
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: .+
我知道如何向路线添加参数。但我想匹配控制器和动作,使其具有像/controller/action/params这样的路由…另一种方法是在注释仍然没有默认路由的情况下进行匹配。不,这是可能的。请看下面的答案。我认为奇怪的是,如果您使用控制台工具生成包,它将创建一个默认控制器,并通过注释定义路由。但是官方的书没有提到通过注释的路由——书中没有提到。如果这是默认设置,我认为应该指出并提供文档(或链接)。BASTA的评论:“Marc Melina美利奴:考虑这个用例——一个具有默认视图、单个帖子查看、留言簿、留言簿表单等的博客。对于默认视图,我不希望URL是格式<代码>。http://example.com/blog/slug,但只是
http://example.com/slug
。这将是网站的默认视图,当然没有什么可以被视为“例外”“。此外,让您的JS处理路由并动态加载应用程序视图是完全合理的,在这种情况下,所有路由都将提供基本布局,您的JS路由器将确定URL并呈现视图。这需要一个全面的路线Marc,我想你还没有听说过SEO,当重组一个站点时,改变路线有时是必要的,并且可能需要一个全面的路线来提供正确的重定向(301状态)工作,干杯,但只是为了增强:“Default”是你的控制器的类名(第一个字母大写,没有“控制器”部分)。此答案中显示的代码有问题,它需要路由名称。当前假定模式:
为路由名称,模式:
,默认值:
和要求:
需要在同一级别缩进。谢谢,这可能是我路由文件中的匆忙复制/粘贴作业!