路由

编辑该页面

警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 3.1,不再维护。

这个页面的更新版本Symf欧宝娱乐app下载地址ony 6.2(当前的稳定版本)。

路由

美丽的url是一个绝对必须为任何严重的web应用程序。这意味着留下丑陋的urlindex . php ? article_id = 57赞成这样/读/ intro-to-sy欧宝娱乐app下载地址mfony

灵活性是更重要的。如果您需要更改一个页面的URL/博客/欧宝app在哪里找新闻吗?你需要多少链接应该追捕和更新做出改变吗?如果你使用Symfony的路由器欧宝娱乐app下载地址,改变很简单。

Symf欧宝娱乐app下载地址ony路由器允许您定义创造性的url映射到应用程序的不同区域。在本章结束时,您将能够:

  • 创建复杂的路由映射到控制器
  • 内部生成的url模板和控制器
  • 加载路由资源包(或其他地方)
  • 调试你的路线

路由的例子

一个路线是一个从一个URL路径映射到一个控制器。例如,假设您想匹配任何URL/博客/我的帖子/博客/ all-about-s欧宝娱乐app下载地址ymfony并将其发送到控制器,可以查找和渲染,博客条目。路线很简单:

  • 注释
  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31
/ / src / AppBundle /控制器/ BlogController.php名称空间AppBundle\控制器;使用欧宝娱乐app下载地址\\FrameworkBundle\控制器\控制器;使用Sensio赞助\\FrameworkExtraBundle\配置\路线;BlogController扩展控制器{/ * * *匹配/博客到底是* *@Route(name = " /博客”“blog_list”) * /公共函数listAction(){/ /……}/ * * *匹配/博客/ * * *@Route(“/博客/{蛞蝓}”,name = " blog_show ") * /公共函数showAction(美元鼻涕虫){/ /美元料将平等的动态URL的一部分/ /如在/博客/ yay-routing,那么$蛞蝓=“yay-routing”/ /……}}

由于这两个路线:

  • 如果用户进入/博客,第一个路线相匹配listAction ()执行;
  • 如果用户进入/博客/ *第二个途径是匹配的showAction ()是执行。因为路由路径/博客/{蛞蝓},一个美元蛞蝓变量传递给showAction ()匹配的值。例如,如果用户去/博客/ yay-routing,然后美元蛞蝓就等于yay-routing

每当你有一个{占位符}在你的路由路径,这部分成为一个通配符:它匹配任何价值。控制器现在可以有一个参数称为美元的占位符(通配符和参数名称必须匹配)。

每个路线也有一个内部的名字:blog_listblog_show。这些可以是任何东西(只要每个都是独一无二的),还没有任何意义。之后,您将使用它来生成的url。

@Route每一个方法被调用注释。如果你宁愿在YAML配置您的路线,XML或PHP,没问题!

在这些格式_controller“默认值”值是一个特殊的键,告诉Symfony控制器时应该执行一个URL匹配这个路线。欧宝娱乐app下载地址的_controller字符串被称为逻辑名。它遵循一个模式,点到一个特定的PHP类和方法,在这种情况下AppBundle \控制器\ BlogController:: listActionAppBundle \控制器\ BlogController:: showAction方法。

这是Symfony的目标路由器:请求的URL映射欧宝娱乐app下载地址到一个控制器。在这个过程中,您将了解各种各样的技巧,让即使是最复杂的url映射简单。

添加{通配符}要求

想象一下blog_list路线将包含一个分页的博客文章的列表,这样的url/博客/ 2/博客/ 3页面2和3。如果你改变路线的道路页面/博客/ {},你会有一个问题:

  • blog_list:页面/博客/ {}将匹配/博客/ *;
  • blog_show:/博客/{蛞蝓}匹配/博客/ *

当两个路线匹配相同的URL,第一个路线的加载获胜。不幸的是,这意味着/博客/ yay-routing将匹配blog_list。没有好!

为了解决这个问题,添加一个要求这一{页面}通配符可以只有匹配的数字(数字):

  • 注释
  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日24
/ / src / AppBundle /控制器/ BlogController.php名称空间AppBundle\控制器;使用欧宝娱乐app下载地址\\FrameworkBundle\控制器\控制器;使用Sensio赞助\\FrameworkExtraBundle\配置\路线;BlogController扩展控制器{/ * * *@Route(“/博客/{页面}”,name = " blog_list "需求={“页面”:" \ d + "}) * /公共函数listAction(美元页面){/ /……}/ * * *@Route(“/博客/{蛞蝓}”,name = " blog_show ") * /公共函数showAction(美元鼻涕虫){/ /……}}

\ d +是一个正则表达式相匹配的数字任何长度。现在:

URL 路线 参数
/博客/ 2 blog_list 美元的页面=2
/博客/ yay-routing blog_show 美元蛞蝓=yay-routing

了解其他路线需求——比如HTTP方法,主机名和动态表情——看到的如何定义路由需求

给{占位符}一个默认值

在前面的例子中,blog_list有一个路径页面/博客/ {}。如果用户访问/博客/ 1,它将匹配。但如果他们访问/博客,它将匹配。一旦你添加一个{占位符}路线,它必须有一个值。

所以你怎么舍得blog_list再一次匹配,当用户访问/博客吗?通过添加一个默认的值:

  • 注释
  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/ / src / AppBundle /控制器/ BlogController.php名称空间AppBundle\控制器;使用欧宝娱乐app下载地址\\FrameworkBundle\控制器\控制器;使用Sensio赞助\\FrameworkExtraBundle\配置\路线;BlogController扩展控制器{/ * * *@Route(“/博客/{页面}”,name = " blog_list "需求={“页面”:" \ d + "}) * /公共函数listAction(美元页面=1){/ /……}}

现在,当用户访问/博客,blog_list路线将匹配和美元的页面默认值吗1

先进的路由的例子

记住这一切,看看这个先进的例子:

  • 注释
  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
/ / src / AppBundle /控制器/ ArticleController.php/ /……ArticleController扩展控制器{/ * * *@Route(*”/文章/ {_locale} /{一}/{蛞蝓}。{_format}", * defaults={"_format": "html"}, * requirements={ * "_locale": "en|fr", * "_format": "html|rss", * "year": "\d+" * } * ) */< /span>公共函数showAction(美元_locale,美元一年,美元鼻涕虫){}}

正如您所看到的,这条路如果只会匹配{_locale}URL的一部分fr如果{一}是一个数字。这条路还展示了如何使用占位符之间的一个点,而不是削减。的url匹配这条路线的样子:

  • /文章/ en / 2010 /我的帖子
  • / / fr / 2010 / my-post.rss文章
  • / / en / 2013 / my-latest-post.html文章

这个例子还强调了特殊_format路由参数。使用这个参数时,匹配的值变成了“请求格式”请求对象。

最终,请求格式是用于诸如设置内容类型的响应(如json请求格式转化为内容类型application / json)。它也可以用于控制器来呈现不同的模板的每个值_format。的_format参数是一个非常强大的方式来呈现相同的内容在不同的格式。

在Sy欧宝娱乐app下载地址mfony版本3.0之前,可以覆盖通过添加一个查询请求格式参数命名_format(例如:/ foo / bar ? _format = json)。依靠这种行为不仅被认为是不好的做法,这将使应用程序的升级Symfony 3。欧宝娱乐app下载地址

请注意

有时你想让你的某些部分全球航线可配置的。欧宝娱乐app下载地址Symfony提供了方法利用服务容器参数。阅读更多关于这个的”如何使用服务容器参数在你的路线吗”。

谨慎

路线占位符名称不能以数字开头,并且不能超过32个字符。

特殊的路由参数

如您所见,每个路由参数或最终可用默认值作为参数的控制器方法。此外,特别的有三个参数:每个添加一个独特的功能在您的应用程序:

_controller
如您所见,这个参数是用来确定哪些时控制器执行匹配的路线。
_format
用于设置请求格式(阅读更多)。
_locale
用于设置语言环境的请求(阅读更多)。
. .指数::
单:路由;单一控制器:控制器;字符串命名格式

控制器命名模式

如果你使用YAML、XML或PHP路由配置,那么每个路线必须有一个_controller控制器参数,后者决定时应该执行这条路线相匹配。这个参数使用一个简单的字符串模式称为逻辑控制器名称PHP, Sym欧宝娱乐app下载地址fony映射到一个特定的方法和类。该模式有三个部分,每个冒号隔开:

:控制器:行动

例如,一个_controller的价值AppBundle:博客:显示意思是:

控制器类 方法名称
AppBundle BlogController showAction ()

控制器可能会看起来像这样:

1 2 3 4 5 6 7 8 9 10 11 12
/ / src / AppBundle /控制器/ BlogController.php名称空间AppBundle\控制器;使用欧宝娱乐app下载地址\\FrameworkBundle\控制器\控制器;BlogController扩展控制器{公共函数showAction(美元鼻涕虫){/ /……}}

请注意,Symfony添欧宝娱乐app下载地址加字符串控制器类名(博客= >BlogController),行动方法名(显示= >showAction ())。

你也可以参考这个控制器使用完全限定类名和方法:AppBundle \控制器\ BlogController:: showAction。但如果你遵循一些简单的规则,逻辑名称更简洁,并允许更大的灵活性。

请注意

除了使用逻辑名或完全限定类名,Symfony支持第三种方法指的是一个控制器。欧宝娱乐app下载地址这个方法使用一个冒号分隔符(如。service_name: indexAction),是指控制器作为服务(见如何定义控制器作为服务吗)。

加载路径

欧宝娱乐app下载地址Symfony加载的所有航线为您的应用程序路由配置文件:应用程序/配置/ routing.yml。但是从这个文件里面,你可以加载任何其他你想要的路由文件。实际上,默认情况下,Symfony装载注释欧宝娱乐app下载地址从AppBundle的路由配置控制器/目录,Symfony如何看待我们的注释路线:欧宝娱乐app下载地址

  • YAML
  • XML
  • PHP
1 2 3 4
# app / config / routing.yml应用:资源:“@AppBundle /控制器/”类型:注释

加载航线的更多细节,包括如何加载路径的路径前缀,明白了如何包含外部路由资源

生成的url

路由系统也应该用于生成的url。在现实中,路由是一个双向系统:将URL映射到一个控制器和一个路由回一个URL。

生成一个URL,您需要指定路线的名称(如。blog_show)和任何通配符(如。蛞蝓=我的博客帖子)用于路由的路径。根据这些信息,任何URL可以很容易地生成:

1 2 3 4 5 6 7 8 9 10 11 12 13
MainController扩展控制器{公共函数showAction(美元鼻涕虫){/ /……/ / /博客/我的博客帖子美元url=美元- >generateUrl (“blog_show”,数组(“鼻涕虫”= >“我的博客帖子”));}}

请注意

generateUrl ()方法中定义的基础控制器这段代码的类只是一个快捷方式:

1 2 3 4
美元url=美元- >容器- >get (“路由器”)- >生成(“blog_show”,数组(“鼻涕虫”= >“我的博客帖子”));

生成的url查询字符串

生成()方法使用通配符的数组值生成URI。但是如果你通过额外的,他们将被添加到URI查询字符串:

1 2 3 4 5
美元- >get (“路由器”)- >生成(“博客”,数组(“页面”= >2,“类别”= >S欧宝娱乐app下载地址ymfony的));/ / /博客/ 2 ?类别= Symf欧宝娱乐app下载地址ony

从一个模板生成的url

生成的url在树枝,看到模板的章节:创建和使用模板。如果您还需要生成url在JavaScript中,看到的如何在JavaScript生成url路由

生成绝对url

默认情况下,路由器将产生相对url(例如/博客)。从一个控制器,通过UrlGeneratorInterface: ABSOLUTE_URL的第三个参数generateUrl ()方法:

1 2 3 4
使用欧宝娱乐app下载地址\组件\路由\发电机\UrlGeneratorInterface;美元- >generateUrl (“blog_show”,数组(“鼻涕虫”= >“我的博客帖子”),UrlGeneratorInterface::ABSOLUTE_URL);/ / http://www.example.com/blog/my-blog-post

请注意

时使用的主机产生一个绝对URL使用当前的自动检测请求对象。当从外部web上下文生成绝对url(例如在一个控制台命令)这是行不通的。看到如何生成url从控制台学习如何解决这个问题。

故障排除

下面是一些常见的错误你可能会看到在处理路由:

控制器”AppBundleControllerBlogController: showAction()要求您提供一个值“鼻涕虫美元”的论点。

这发生在你的控制器方法有一个参数(如。美元蛞蝓):

1 2 3 4
公共函数showAction(美元鼻涕虫){/ / . .}

但是你的路由路径有一个{蛞蝓}通配符(例如/博客/显示)。添加一个{蛞蝓}你的路由路径:/博客/显示/{蛞蝓}或者给参数默认值(即。$蛞蝓=零)。

一些强制参数丢失(“鼻涕虫”)来生成一个URL路由“blog_show”。

这意味着你想生成的URLblog_show但你是路线传递一个鼻涕虫值(这是必需的,因为它有一个{蛞蝓}通配符在路由路径。为了解决这个问题,通过一个鼻涕虫值在生成的路线:

1 2 3 4
美元- >generateUrl (“blog_show”,数组(“鼻涕虫”= >“slug-value”));/ /或者在树枝/ /{{路径(blog_show,{“鼻涕虫”:“slug-value”})}}

总结

路由系统传入请求的URL映射到控制器的功能,应该叫来处理请求。它允许您指定美丽的url和保持您的应用程序的功能解耦的url。路由是一种双向机制,这意味着它还应该用于生成的url。

继续前进!

路由,请检查!现在发现的力量控制器

这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。