路由
编辑该页面一个>警告:你浏览的文档欧宝体育电话<一个href=”//www.oldmanjams.com/releases/2.2">欧宝娱乐app下载地址Symfony 2.2一个>,不再维护。
读<一个href=”//www.oldmanjams.com/doc/current/routing.html">这个页面的更新版本一个>Symf欧宝娱乐app下载地址ony 6.2(当前的稳定版本)。
你能发现这个问题吗?注意,这两个航线模式相匹配的URL的样子/博客/ *
。Symf欧宝娱乐app下载地址ony路由器总是选择第一个找到匹配的路线。换句话说,blog_show
路线从来没有是匹配的。相反,一个URL/博客/我的博客帖子
将匹配第一个路线(博客
),返回一个没有意义的价值我的博客帖子
到{页面}
参数。
URL | 路线 | 参数 |
---|---|---|
/博客/ 2 | 博客 | {页面}= 2 |
/博客/我的博客帖子 | 博客 | {页面}=我的博客帖子 |
这个问题的答案是添加路线需求。本例中的路线将工作完美的如果页面/博客/ {}
路径只有匹配的url的地方{页面}
部分是一个整数。幸运的是,可以很轻松地添加正则表达式要求为每个参数。例如:
- YAML
- XML
- PHP
1 2 3 4 5
博客:路径:页面/博客/ {}默认值:{_controller:AcmeBlogBundle:博客:指数,页面:1}要求:页面:\ d +
的\ d +
要求是一个正则表达式表示的值{页面}
参数必须是一个数字(即数量)。的博客
路线仍将匹配一个URL/博客/ 2
(因为2是一个数字),但它将不再匹配一个URL/博客/我的博客帖子
(因为我的博客帖子
是不一个数字)。
因此,一个URL/博客/我的博客帖子
现在将正确地匹配blog_show
路线。
URL | 路线 | 参数 |
---|---|---|
/博客/ 2 | 博客 | {页面}= 2 |
/博客/我的博客帖子 | blog_show | {蛞蝓}=我的博客帖子 |
自正则表达式参数要求,每个需求的复杂性和灵活性是完全取决于你。假设您的应用程序的主页上有两种不同的语言,基于URL:
- YAML
- XML
- PHP
1 2 3 4 5
主页:路径:/{文化}默认值:{_controller:AcmeDemoBundle:主要:主页,文化:在}要求:文化:在| fr
为传入请求{文化}
部分的URL匹配正则表达式(en | fr)
。
/ | {文化}= en |
/ en | {文化}= en |
/ fr | {文化}= fr |
/ es | 这条路不匹配 |
2.2
的方法
选择是在Symfony2.2补充道。欧宝娱乐app下载地址使用_method
在旧版本的要求。
尽管这两个航线有相同的路径(/联系
),第一个将匹配只能请求路由和第二只匹配POST请求。这意味着您可以通过相同的显示形式和提交表单的URL,而使用不同的控制器的两个动作。
请注意
如果没有方法
指定的路线将匹配所有方法。
你也可以匹配HTTP主机传入的请求。有关更多信息,请参见<一个href=”//www.oldmanjams.com/doc/2.2/components/routing/hostname_pattern.html" class="reference internal">如何匹配基于主机的路由一个>在路由组件文档。欧宝体育电话
正如您所看到的,这条路如果只会匹配{文化}
URL的一部分在
或fr
如果{一}
是一个数字。这条路还展示了如何使用占位符之间的一个点,而不是削减。的url匹配这条路线的样子:
/文章/ en / 2010 /我的帖子
/ / fr / 2010 / my-post.rss文章
/ / en / 2013 / my-latest-post.html文章
请注意
有时你想让你的某些部分全球航线可配置的。欧宝娱乐app下载地址Symfony2.1为你提供了一个方法通过利用服务容器参数。阅读更多关于这个的”<一个href=”//www.oldmanjams.com/doc/2.2/cookbook/routing/service_container_parameters.html" class="reference internal">如何使用服务容器参数在你的路线吗一个>。