如何定义路由需求

编辑该页面

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

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

如何定义路由需求

路线的需求可用于制造特定的路线只有在特定的条件下比赛。举个最简单的例子包括限制路由{通配符}只匹配一些正则表达式:

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

多亏了\ d +要求(即任何长度的“数字”),/博客/ 2这个路线,但比赛吗/博客/一些字符串匹配。

为什么你会关心需求?如果一个请求匹配两个路线,那么第一个路线总是赢家。通过增加需求到第一个路线,你可以让每个路由匹配在合适的情况下。看到路由了一个例子。

自正则表达式参数要求,每个需求的复杂性和灵活性是完全取决于你。假设您的应用程序的主页上有两种不同的语言,基于URL:

  • 注释
  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14
/ / src /控制器/ MainController.php/ /……MainController扩展AbstractController{/ * * *@Route(“/ {_locale}”,默认= {“_locale”=“en”},需求= {*“_locale”=“en | fr”*}) * /公共函数主页(美元_locale){}}

为传入请求{_locale}部分的URL匹配正则表达式(en | fr)

路径 参数
/ {_locale}=“en”
/ en {_locale}=“en”
/ fr {_locale}=“fr”
/ es 这条路不匹配

请注意

您可以启用utf - 8路由匹配通过设置use utf8选择当声明或进口路线。这将使如在需求匹配任何utf - 8字符而不是单个字节。

提示

路线的需求还可以包括容器参数,如在解释道这篇文章。这方便当正则表达式很复杂,在应用程序中重复使用。

添加HTTP方法需求

除了URL,您还可以匹配的方法传入的请求(例如,头、POST、PUT、DELETE)。假设您创建一个API来你的博客,你有两个路线:一个用于显示一篇文章(GET或头上请求),一个用于更新一篇文章(PUT请求)。这可以通过以下路线配置:

  • 注释
  • 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日
/ / src /控制器/ BlogApiController.php名称空间应用程序\控制器;/ /……BlogApiController扩展AbstractController{/ * * *@Route(“/ api /文章/ {id}”,方法={“得到”、“头”})* /公共函数显示(美元id){/ /……后返回一个JSON响应}/ * * *@Route(“/ api /文章/ {id}”,方法={}“放”)* /公共函数编辑(美元id){/ /……编辑一篇文章}}

尽管这两个航线有相同的路径(/ api /文章/ {id}),第一个将匹配只有或请求路由和第二只匹配把请求路由。这意味着您可以显示和编辑这个职位相同的URL,而使用不同的控制器的两个动作。

请注意

如果没有方法指定的路线将匹配所有方法。

提示

如果你使用HTML表单和HTTP方法其他得到帖子,你需要包括一个_method参数假的HTTP方法。看到如何改变一个表单的动作和方法为更多的信息。

添加一个主机的要求

你也可以匹配HTTP主机传入的请求。有关更多信息,请参见如何匹配基于主机的路由在路由组件文档。欧宝体育电话

添加动态需求与表达式

对于非常复杂的需求,您可以使用动态表达式来匹配任何请求的信息。看到如何通过条件限制路由匹配

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