路由
编辑本页一个>警告:您正在浏览的文档欧宝体育电话<一个href="//www.oldmanjams.com/releases/2.6">欧宝娱乐app下载地址Symfony 2.6一个>,现已不再维护。
读<一个href="//www.oldmanjams.com/doc/current/routing.html">本页的更新版本一个>用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。
你能发现问题吗?注意,两条路由的模式都与如下url相匹配/博客/ *
.Symf欧宝娱乐app下载地址ony路由器将始终选择第一个匹配它找到的路由。换句话说,blog_show
路线从来没有是匹配的。相反,一个URL/博客/我的博客帖子
将匹配第一个路由(博客
)并返回一个无意义的值我的博客帖子
到{页面}
参数。
URL | 路线 | 参数 |
---|---|---|
/博客/ 2 |
博客 |
{页面} =2 |
/博客/我的博客帖子 |
博客 |
{页面} =“我的博客帖子” |
这个问题的答案是添加路由需求或路线条件(见<一个href="//www.oldmanjams.com/doc/2.6/book/routing.html" class="reference internal">路由一个>).此示例中的路由将完美地工作,如果页面/博客/ {}
路径只有匹配url,其中{页面}
部分是一个整数。幸运的是,可以轻松地为每个参数添加正则表达式需求。例如:
- 注释
- YAML
- XML
- PHP
12 3 4 5 6 7 8 9 10 11 12 13
/ / src / AppBundle /控制器/ BlogController.php/ /……/ * * *@Route(“/博客/{页面}”,缺省值={“页面”:1},需求={*“页面”:“\ d +" * }) */公共函数indexAction($页面){/ /……}
的\ d +
的值是一个正则表达式{页面}
参数必须为数字(即数字)。的博客
route仍然会匹配URL,比如/博客/ 2
(因为2是一个数字),但它将不再匹配一个URL/博客/我的博客帖子
(因为我的博客帖子
是不一个数字)。
结果,一个URL像/博客/我的博客帖子
现在将正确匹配blog_show
路线。
URL | 路线 | 参数 |
---|---|---|
/博客/ 2 |
博客 |
{页面} =2 |
/博客/我的博客帖子 |
blog_show |
{蛞蝓} =我的博客帖子 |
/博客/ 2-my-blog-post |
blog_show |
{蛞蝓} =2-my-blog-post |
由于参数要求是正则表达式,因此每个要求的复杂性和灵活性完全取决于您。假设你的应用程序的主页有两种不同的语言,基于URL:
- 注释
- YAML
- XML
- PHP
12 3 4 5 6 7 8 9 10 11 12 13 14
/ / src / AppBundle /控制器/ MainController.php/ /……类MainController扩展控制器{/ * * *@Route(“/ {_locale}”,默认={“_locale”:“en”},需求={*“_locale”:“en | fr”*})* /公共函数homepageAction($_locale){}}
对于传入的请求,{_locale}
URL的一部分与正则表达式匹配(en | fr)
.
路径 | 参数 |
---|---|
/ |
{_locale} =“en” |
/ en |
{_locale} =“en” |
/ fr |
{_locale} =“fr” |
/ es |
不符合这条路线 |
尽管这两条路径具有相同的路径(/联系
),第一条路由只匹配GET请求,第二条路由只匹配POST请求。这意味着您可以通过相同的URL显示表单并提交表单,同时为这两个操作使用不同的控制器。
请注意
如果没有方法
路由是否匹配所有方法。
如您所见,只有当{_locale}
URL的一部分是任意一个在
或fr
如果{一}
是一个数字。这条路由还展示了如何在占位符之间使用点而不是斜线。与此路由匹配的url可能是这样的:
/文章/ en / 2010 /我的帖子
/ / fr / 2010 / my-post.rss文章
/ / en / 2013 / my-latest-post.html文章
请注意
有时你想让你的路由的某些部分全局可配置。欧宝娱乐app下载地址Symfony通过利用服务容器参数为您提供了一种方法。详情请参阅“<一个href="//www.oldmanjams.com/doc/2.6/cookbook/routing/service_container_parameters.html" class="reference internal">如何在路由中使用服务容器参数一个>".