路由 编辑本页 警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 6.0,现已不再维护。 读本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。 控制器动作生成响应。路由配置定义为每个传入URL运行哪个操作。它还提供了其他有用的功能,比如生成seo友好的url(例如。/读/ intro-to-sy欧宝娱乐app下载地址mfony而不是index . php ?article_id = 57). 欧宝娱乐app下载地址Symfony推荐属性因为把路由和控制器放在同一个地方很方便。 控制器与这些路由相关联。属性在PHP 8及更高版本中是原生的,因此您可以立即使用它们。 在使用它们之前,您需要向项目添加一些配置。如果您的项目使用欧宝娱乐app下载地址Symfony Flex,该文件已经为您创建。否则,手动创建以下文件: 1 2 3 4 5 6 7 8 #配置/线路/ attributes.yaml控制器:资源:. . / . . / src /控制器/类型:属性内核:资源:. . / . . / src / Kernel.php类型:属性 这个配置告诉Symfony查找被定义为属性的路由欧宝娱乐app下载地址src /控制器/目录中。 类定义路由/博客URL在您的应用程序。为此,创建一个控制器类像下面这样: 属性 12 3 4 5 6 7 8 9 10 11 12 13 14 / / src /控制器/ BlogController.php名称空间应用程序\控制器;使用欧宝娱乐app下载地址\包\FrameworkBundle\控制器\AbstractController;使用欧宝娱乐app下载地址\组件\路由\注释\路线;类BlogController扩展AbstractController{#[Route('/blog', name: 'blog_list')]公共函数列表():响应{/ /……}} 这个配置定义了一个名为blog_list属性时匹配的/博客URL。匹配发生时,应用程序将运行列表()方法BlogController类。 请注意 匹配路由时不考虑URL的查询字符串。在这个例子中,url像/博客吗?foo = bar而且/博客吗?foo = bar bar = foo也将匹配blog_list路线。 谨慎 如果在同一个文件中定义多个PHP类,Symfony只加载第一个类的路由,而忽略所有其他路由。欧宝娱乐app下载地址 路由名称(blog_list)现在不重要,但以后就很重要了生成的url.您只需要记住,每个路由名在应用程序中必须是唯一的。 blog_list这与/博客URL的列表()的行动BlogController: YAML XML PHP 1 2 3 4 5 6 7 8 9 #配置/ routes.yamlblog_list:路径:/博客#控制器值的格式为:controller_class::method_name控制器:控制器应用\ \ BlogController:列表方法的__invoke()方法实现时,则使用##控制器类,你可以跳过'::method_name'部分:#控制器:App\ controller \BlogController 12 3 4 5 6 7 8 9 10 11 12 13 14 15 <!——config/routes.xml——> .xml<??> . xml version="1.0" encoding="UTF-8"<路线xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/routing”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/routing //www.oldmanjams.com/schema/routing/routing-1.0.xsd”><!——控制器值的格式为controller_class::method_name——><路线id=“blog_list”路径=“/博客”控制器=“应用程序控制器\ \ BlogController:列表”/><!——如果该动作是作为控制器类的__invoke()方法实现的,你可以跳过'::method_name'部分:controller="App\ controller \BlogController"/>——>路线> 12 3 4 5 6 7 8 9 10 11 12 13 14 / /配置/ routes.php使用应用程序\控制器\BlogController;使用欧宝娱乐app下载地址\组件\路由\加载程序\配置器\RoutingConfigurator;返回函数(RoutingConfigurator$路线){$路线->add (“blog_list”,“/博客”)//控制器值的格式为[controller_class, method_name]->控制器([BlogController::类,“列表”])方法的__invoke()方法来实现该动作//控制器类,你可以跳过'method_name'部分/ / - - - - - - >控制器(BlogController::类);}; 请注意 默认情况下,Symfo欧宝娱乐app下载地址ny只加载以YAML格式定义的路由。如果用XML和/或PHP格式定义路由,则需要这样做更新src/Kernel.php文件. 得到,帖子,把等)使用方法选项限制每个路由应响应的动词: 属性 YAML XML PHP 12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 / / src /控制器/ BlogApiController.php名称空间应用程序\控制器;/ /……类BlogApiController扩展AbstractController{#(路线(' / api /文章/ {id}’,方法:[‘得到’,‘头’]))公共函数显示(int$id):响应{/ /……返回一个JSON响应}#[路由('/api/posts/{id}',方法:['PUT'])]公共函数编辑(int$id):响应{/ /……编辑一篇文章}} 1 2 3 4 5 6 7 8 9 10 #配置/ routes.yamlapi_post_show:路径:/ api /文章/ {id}控制器:控制器应用\ \ BlogApiController::显示方法:得到|头api_post_edit:路径:/ api /文章/ {id}控制器:应用程序控制器\ \ BlogApiController::编辑方法:把 12 3 4 5 6 7 8 9 10 11 12 13 14 15 <!——config/routes.xml——> .xml<??> . xml version="1.0" encoding="UTF-8"<路线xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/routing”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/routing //www.oldmanjams.com/schema/routing/routing-1.0.xsd”><路线id=“api_post_show”路径=“/ api /职位/ {id}”控制器=“应用程序控制器\ \ BlogApiController:秀”方法=“|头”/><路线id=“api_post_edit”路径=“/ api /职位/ {id}”控制器=“应用程序控制器\ \ BlogApiController:编辑”方法=“把”/>路线> 12 3 4 5 6 7 8 9 10 11 12 13 14 / /配置/ routes.php使用应用程序\控制器\BlogApiController;使用欧宝娱乐app下载地址\组件\路由\加载程序\配置器\RoutingConfigurator;返回函数(RoutingConfigurator$路线){$路线->add (“api_post_show”,' / api /文章/ {id} ')->控制器([BlogApiController::类,“显示”])->方法([“得到”,“头”]);$路线->add (“api_post_edit”,' / api /文章/ {id} ')->控制器([BlogApiController::类,“编辑”])->方法([“把”]);}; 提示 HTML表单只支持得到而且帖子方法。如果您正在使用与HTML表单不同的方法调用路由,请添加一个名为_method用方法使用(例如:).如果您使用欧宝娱乐app下载地址Symfony的形式这将自动为您完成framework.http_method_override选择是真正的. 条件选项,如果你需要一些路由匹配基于一些任意的匹配逻辑: 属性 YAML XML PHP 12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 / / src /控制器/ DefaultController.php名称空间应用程序\控制器;使用欧宝娱乐app下载地址\包\FrameworkBundle\控制器\AbstractController;使用欧宝娱乐app下载地址\组件\HttpFoundation\响应;使用欧宝娱乐app下载地址\组件\路由\注释\路线;类DefaultController扩展AbstractController{#(路线(' /接触'名称:“接触”条件:"context.getMethod() in ['GET', 'HEAD'] and request.headers.get('User-Agent') match '/firefox/i'",)//表达式也可以包含配置参数://条件:"request.headers.get('User-Agent')匹配'%app. allowed_浏览器%'"公共函数联系():响应{/ /……}} 1 2 3 4 5 6 7 8 9 #配置/ routes.yaml联系人:路径:/联系控制器:“App \控制器\ DefaultController:接触”条件:"context.getMethod() in ['GET', 'HEAD'] and request.headers.get('User-Agent') match '/firefox/i'"#表达式也可以包含配置参数:#条件:"request.headers.get('User-Agent')匹配'%app. allowed_浏览器%'"#表达式甚至可以使用环境变量:#条件:"context.getHost() == env('APP_MAIN_HOST')" 12 3 4 5 6 7 8 9 10 11 12 13 14 15 <!——config/routes.xml——> .xml<??> . xml version="1.0" encoding="UTF-8"<路线xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/routing”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/routing //www.oldmanjams.com/schema/routing/routing-1.0.xsd”><路线id=“接触”路径=“/接触”控制器=“应用程序控制器\ \ DefaultController:接触”><条件>['GET', 'HEAD']中的context.getMethod()和request.headers.get('User-Agent')匹配'/firefox/i'条件><!——表达式也可以包含配置参数:——><!——<条件>request.headers.get('User-Agent')匹配'%app. get 'allowed_browsers % > < /条件——><!——表达式甚至可以使用环境变量:——><!——<条件>context.getHost() == env('APP_MAIN_HOST')条件>——> . gethost (路线>路线> 12 3 4 5 6 7 8 9 10 11 12 13 14 / /配置/ routes.php使用应用程序\控制器\DefaultController;使用欧宝娱乐app下载地址\组件\路由\加载程序\配置器\RoutingConfigurator;返回函数(RoutingConfigurator$路线){$路线->add (“接触”,' /接触')->控制器([DefaultController::类,“接触”])->条件('context.getMethod() in ["GET", "HEAD"] and request.headers.get("User-Agent") match "/firefox/i"')//表达式也可以包含配置参数:// ->条件('request.headers.get("User-Agent")匹配"%app. allowed_浏览器%"')//表达式甚至可以使用环境变量:/ / - - - - - - >条件(“context.getHost () = = env (APP_MAIN_HOST)”);}; 的值条件选项是一个使用任何有效的表达式表达式语言语法并且可以使用Symfony创建的这些变量:欧宝娱乐app下载地址 上下文 的一个实例RequestContext,它包含了关于被匹配路由的最基本信息。 请求 的欧宝娱乐app下载地址Symfony的请求对象,表示当前请求。 你也可以使用这个函数: env(字符串名称)美元 返回变量的值环境变量处理器 在幕后,表达式被编译为原始PHP。正因为如此,使用条件除了底层PHP执行所需的时间之外,key不会造成额外的开销。 谨慎 条件是不在生成url时考虑(本文后面将对此进行解释)。 调试:路由器命令以Symfony评估它们的相同顺序列出所有应用程序路由:欧宝娱乐app下载地址 12 3 4 5 6 7 8 9 10 11 12 $php bin /控制台调试:路由器 ---------------- ------- ------- ----- -------------------------------------------- 名方法方案主机的路径 ---------------- ------- ------- ----- -------------------------------------------- 主页任何任何/接触得到任何任何/接触contact_process POST /接触article_show任何任何/文章/ {_locale} /{一}/{标题}。{_format}博客任何任何/博客/{页面}blog_show任何任何/博客/{蛞蝓 } ---------------- ------- ------- ----- -------------------------------------------- 将某些路由的名称(或名称的一部分)传递给这个参数以打印路由详细信息: 1 2 3 4 5 6 7 8 9 10 11 $php bin /控制台调试:路由器app_lucky_number +-------------+---------------------------------------------------------+ | 属性|值 | +-------------+---------------------------------------------------------+ | 路线名称| app_lucky_number | | |路径/幸运/数量/{马克斯}| |…|……| | Options | compiler_class: 欧宝娱乐app下载地址Symfony\Component\Routing\RouteCompiler | | | utf8:真正的| +-------------+---------------------------------------------------------+ 调用另一个命令路由器:匹配它会显示哪个路由将匹配给定的URL。找出为什么一些URL没有执行你期望的控制器动作是很有用的: 1 2 3 $php bin/console router:match /lucky/number/8 [OK]路由“app_lucky_number”匹配 /博客).然而,通常在定义路由时,有些部分是可变的。例如,显示一些博客文章的URL可能包括标题或段(例如:/博客/第一篇博客或/博客/ all-about-s欧宝娱乐app下载地址ymfony). 在Sy欧宝娱乐app下载地址mfony路由中,可变部分被封装{…}他们必须有一个唯一的名字。例如,显示博客文章内容的路由定义为/博客/{蛞蝓}: 属性 YAML XML PHP 12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 / / src /控制器/ BlogController.php名称空间应用程序\控制器;使用欧宝娱乐app下载地址\包\FrameworkBundle\控制器\AbstractController;使用欧宝娱乐app下载地址\组件\HttpFoundation\响应;使用欧宝娱乐app下载地址\组件\路由\注释\路线;类BlogController扩展AbstractController{/ /……#[Route('/blog/{slug}', name: 'blog_show')]公共函数显示(字符串$鼻涕虫):响应{// $slug将等于URL的动态部分//例如:at /blog/ ay-routing,那么$slug=' ay-routing'/ /……}} 1 2 3 4 #配置/ routes.yamlblog_show:路径:/博客/{蛞蝓}控制器:控制器应用\ \ BlogController::显示 1 2 3 4 5 6 7 8 9 10 <!——config/routes.xml——> .xml<??> . xml version="1.0" encoding="UTF-8"<路线xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/routing”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/routing //www.oldmanjams.com/schema/routing/routing-1.0.xsd”><路线id=“blog_show”路径=“/博客/{蛞蝓}”控制器=“应用程序控制器\ \ BlogController:秀”/>路线> 1 2 3 4 5 6 7 8 9 / /配置/ routes.php使用应用程序\控制器\BlogController;使用欧宝娱乐app下载地址\组件\路由\加载程序\配置器\RoutingConfigurator;返回函数(RoutingConfigurator$路线){$路线->add (“blog_show”,“/博客/{蛞蝓}”)->控制器([BlogController::类,“显示”]);}; 变量部分的名称({蛞蝓}(在本例中)用于创建一个PHP变量,路由内容存储在其中并传递给控制器。如果用户访问/博客/第一篇博客URL, 欧宝娱乐app下载地址Symfony执行显示()方法中的BlogController类,并传递$slug = 'my-first-post'的参数显示()方法。 路由可以定义任意数量的参数,但是每个参数只能在每条路由上使用一次。/博客/关于-{类别}/页面/ {pageNumber}). blog_show路线(网址:/博客/{蛞蝓})和ablog_list路线(网址:页面/博客/ {}).如果路由参数接受任何值,就无法区分这两条路由。 如果用户请求/博客/第一篇博客,两条路由将匹配,Symfony将使用先定义的路由。欧宝娱乐app下载地址方法中添加一些验证即可解决此问题{页面}参数使用需求选择: 属性 YAML XML PHP 12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 / / src /控制器/ BlogController.php名称空间应用程序\控制器;使用欧宝娱乐app下载地址\包\FrameworkBundle\控制器\AbstractController;使用欧宝娱乐app下载地址\组件\HttpFoundation\响应;使用欧宝娱乐app下载地址\组件\路由\注释\路线;类BlogController扩展AbstractController{#(路线(“/博客/{页面}”,名字:“blog_list”,要求:['页' = > ' \ d + ']))公共函数列表(int$页面):响应{/ /……}#[Route('/blog/{slug}', name: 'blog_show')]公共函数显示($鼻涕虫):响应{/ /……}} 1 2 3 4 5 6 7 8 9 10 #配置/ routes.yamlblog_list:路径:页面/博客/ {}控制器:控制器应用\ \ BlogController:列表要求:页面:“\ d +”blog_show:路径:/博客/{蛞蝓}控制器:控制器应用\ \ BlogController::显示 12 3 4 5 6 7 8 9 10 11 12 13 14 <!——config/routes.xml——> .xml<??> . xml version="1.0" encoding="UTF-8"<路线xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/routing”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/routing //www.oldmanjams.com/schema/routing/routing-1.0.xsd”><路线id=“blog_list”路径=“/博客/{页面}”控制器=“应用程序控制器\ \ BlogController:列表”><要求关键=“页面”>\ d +要求>路线><路线id=“blog_show”路径=“/博客/{蛞蝓}”控制器=“应用程序控制器\ \ BlogController:秀”/>路线> 12 3 4 5 6 7 8 9 10 11 12 13 14 15 / /配置/ routes.php使用应用程序\控制器\BlogController;使用欧宝娱乐app下载地址\组件\路由\加载程序\配置器\RoutingConfigurator;返回函数(RoutingConfigurator$路线){$路线->add (“blog_list”,“/博客/{页面}”)->控制器([BlogController::类,“列表”])->需求([“页面”= >“\ d +”]);$路线->add (“blog_show”,“/博客/{蛞蝓}”)->控制器([BlogController::类,“显示”]);/ /……}; 的需求选项定义PHP正则表达式该路由参数必须匹配,才能匹配整个路由。在这个例子中,\ d +正则表达式是否匹配数字任何长度。现在: URL 路线 参数 /博客/ 2 blog_list 美元的页面=2 /博客/第一篇博客 blog_show 美元蛞蝓=第一篇博客 提示 路由需求(以及路由路径)可以包括配置参数,这对于一次性定义复杂的正则表达式并在多个路由中重用它们非常有用。 提示 参数也支持Unicode属性,它们是匹配泛型字符类型的转义序列。例如,陆\ p {}匹配任何语言的任何大写字符,希腊\ p {}匹配任何希腊字符,等等。 请注意 在路由参数中使用正则表达式时,可以设置use utf8路由选项到真正的做任何.字符匹配任何UTF-8字符,而不仅仅是单个字节。 如果您愿意,可以使用语法将需求内联到每个参数中{parameter_name <规定>}.该特性使配置更加简洁,但当需求复杂时,它会降低路由的可读性: 属性 YAML XML PHP 12 3 4 5 6 7 8 9 10 11 12 13 14 15 / / src /控制器/ BlogController.php名称空间应用程序\控制器;使用欧宝娱乐app下载地址\包\FrameworkBundle\控制器\AbstractController;使用欧宝娱乐app下载地址\组件\HttpFoundation\响应;使用欧宝娱乐app下载地址\组件\路由\注释\路线;类BlogController扩展AbstractController{#[Route('/blog/{page<\d+>}', name: 'blog_list')]公共函数列表(int$页面):响应{/ /……}} 1 2 3 4 #配置/ routes.yamlblog_list:路径:/博客/{页< \ d + >}控制器:控制器应用\ \ BlogController:列表 12 3 4 5 6 7 8 9 10 11 12 <!——config/routes.xml——> .xml<??> . xml version="1.0" encoding="UTF-8"<路线xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/routing”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/routing //www.oldmanjams.com/schema/routing/routing-1.0.xsd”><路线id=“blog_list”路径=“/博客/{页< \ d + >}”控制器=“应用程序控制器\ \ BlogController:列表”/><!——……-->路线> 1 2 3 4 5 6 7 8 9 10 / /配置/ routes.php使用应用程序\控制器\BlogController;使用欧宝娱乐app下载地址\组件\路由\加载程序\配置器\RoutingConfigurator;返回函数(RoutingConfigurator$路线){$路线->add (“blog_list”,' /博客/{页< \ d + >} ')->控制器([BlogController::类,“列表”]);/ /……}; blog_list是页面/博客/ {}.如果用户访问/博客/ 1,它会匹配。但是如果他们来访/博客,它会不匹配。一旦你给路由添加了一个参数,它就必须有一个值。 你可以做出blog_list当用户访问时再次匹配/博客属性的默认值{页面}参数。当使用注解或属性时,默认值在控制器动作的参数中定义。在其他配置格式中,它们是用违约选择: 属性 YAML XML PHP 12 3 4 5 6 7 8 9 10 11 12 13 14 15 / / src /控制器/ BlogController.php名称空间应用程序\控制器;使用欧宝娱乐app下载地址\包\FrameworkBundle\控制器\AbstractController;使用欧宝娱乐app下载地址\组件\HttpFoundation\响应;使用欧宝娱乐app下载地址\组件\路由\注释\路线;类BlogController扩展AbstractController{#(路线(“/博客/{页面}”,名字:“blog_list”,要求:['页' = > ' \ d + ']))公共函数列表(int$页面=1):响应{/ /……}} 1 2 3 4 5 6 7 8 9 10 11 #配置/ routes.yamlblog_list:路径:页面/博客/ {}控制器:控制器应用\ \ BlogController:列表默认值:页面:1要求:页面:“\ d +”blog_show:#…… 12 3 4 5 6 7 8 9 10 11 12 13 14 15 <!——config/routes.xml——> .xml<??> . xml version="1.0" encoding="UTF-8"<路线xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/routing”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/routing //www.oldmanjams.com/schema/routing/routing-1.0.xsd”><路线id=“blog_list”路径=“/博客/{页面}”控制器=“应用程序控制器\ \ BlogController:列表”><默认的关键=“页面”>1默认的><要求关键=“页面”>\ d +要求>路线><!——……-->路线> 1 2 3 4 5 6 7 8 9 10 11 / /配置/ routes.php使用应用程序\控制器\BlogController;使用欧宝娱乐app下载地址\组件\路由\加载程序\配置器\RoutingConfigurator;返回函数(RoutingConfigurator$路线){$路线->add (“blog_list”,“/博客/{页面}”)->控制器([BlogController::类,“列表”])->违约([“页面”= >1])->需求([“页面”= >“\ d +”]);}; 现在,当用户访问/博客,blog_list路由将匹配美元的页面将默认为1. 谨慎 你可以有多个可选参数(例如。页面/博客/{蛞蝓}/ {}),但可选参数之后的所有内容都必须是可选的。例如,/{页面}/博客是有效路径,但是页面总是需要的(即/博客将不匹配此路由)。 如果您希望在生成的URL中始终包含一些默认值(例如强制生成/博客/ 1而不是/博客在前面的例子中)添加!参数名前字符:/博客/ {!页面} 当它发生在需求时,默认值也可以使用语法内联在每个参数中{parameter_name ?default_value}.此特性与内联需求兼容,因此您可以在单个参数中内联两者: 属性 YAML XML PHP 12 3 4 5 6 7 8 9 10 11 12 13 14 15 / / src /控制器/ BlogController.php名称空间应用程序\控制器;使用欧宝娱乐app下载地址\包\FrameworkBundle\控制器\AbstractController;使用欧宝娱乐app下载地址\组件\HttpFoundation\响应;使用欧宝娱乐app下载地址\组件\路由\注释\路线;类BlogController扩展AbstractController{#(路线(' /博客/{页< \ d + > ?1}', name: 'blog_list')]公共函数列表(int$页面):响应{/ /……}} 1 2 3 4 #配置/ routes.yamlblog_list:路径:/博客/{页< \ d + > ?1}控制器:控制器应用\ \ BlogController:列表 12 3 4 5 6 7 8 9 10 11 12 <!——config/routes.xml——> .xml<??> . xml version="1.0" encoding="UTF-8"<路线xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/routing”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/routing //www.oldmanjams.com/schema/routing/routing-1.0.xsd”><路线id=“blog_list”路径=“/博客/{页< \ d + > ?1}”控制器=“应用程序控制器\ \ BlogController:列表”/><!——……-->路线> 1 2 3 4 5 6 7 8 9 / /配置/ routes.php使用应用程序\控制器\BlogController;使用欧宝娱乐app下载地址\组件\路由\加载程序\配置器\RoutingConfigurator;返回函数(RoutingConfigurator$路线){$路线->add (“blog_list”,' /博客/{页< \ d + > ?1} ')->控制器([BlogController::类,“列表”]);}; 提示 给…零参数的默认值,在后面不添加任何内容?字符(如。/博客/{页面?}).如果你这样做,不要忘记更新相关控制器参数的类型以允许传递零值(例如替换int美元页面通过美元? int页面). 优先级参数来控制这些路由的优先级: 属性 12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 / / src /控制器/ BlogController.php名称空间应用程序\控制器;使用欧宝娱乐app下载地址\包\FrameworkBundle\控制器\AbstractController;使用欧宝娱乐app下载地址\组件\路由\注释\路线;类BlogController扩展AbstractController{/** *该路由有一个贪婪模式,被首先定义。* /#[Route('/blog/{slug}', name: 'blog_show')]公共函数显示(字符串$鼻涕虫):响应{/ /……}/** *如果没有定义高于0的优先级,就无法匹配此路由。* /#[路由('/blog/list',名称:'blog_list',优先级:2)]公共函数列表():响应{/ /……}} 优先级参数要求为整数值。优先级高的路由排在优先级低的路由前面。未定义时的默认值为0. 1 $Composer需要sensio/framework-extra-bundle 现在,保持前面的路由配置,但是改变控制器动作的参数。而不是字符串$蛞蝓,添加BlogPost美元后: 12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 / / src /控制器/ BlogController.php名称空间应用程序\控制器;使用应用程序\实体\博客;使用欧宝娱乐app下载地址\包\FrameworkBundle\控制器\AbstractController;使用欧宝娱乐app下载地址\组件\HttpFoundation\响应;使用欧宝娱乐app下载地址\组件\路由\注释\路线;类BlogController扩展AbstractController{/ /……#[Route('/blog/{slug}', name: 'blog_show')]公共函数显示(博客$帖子):响应{// $post是slug匹配路由参数的对象/ /……}} 如果你的控制器参数包含对象的类型提示(博客在这种情况下),“参数转换器”发出一个数据库请求,使用请求参数(鼻涕虫在这种情况下)。如果没有找到对象,Symfony将自动生成40欧宝娱乐app下载地址4响应。 读了完整的参数转换器文档欧宝体育电话了解Symfony提供的转换器以及如何配置它们。欧宝娱乐app下载地址 _controller 该参数用于确定路由匹配时执行哪个控制器和动作。 _format 的“请求格式”请求对象。这用于设置内容类型的响应(例如ajson格式转换为内容类型的application / json). _fragment 用于设置片段标识符,该标识符是以。开头的URL的可选最后一部分#字符,用于标识文档的一部分。 _locale 用于设置语言环境根据要求。 您可以包含这些属性(除了_fragment)在单个路由和路由导入中。欧宝娱乐app下载地址Symfony定义了一些具有相同名称的特殊属性(除了前面的下划线),因此您可以更容易地定义它们: 属性 YAML XML PHP 12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 / / src /控制器/ ArticleController.php名称空间应用程序\控制器;/ /……类ArticleController扩展AbstractController{#(路线(路径:' / / {_locale} /搜索文章。{_format}’地区:“en”格式:“html”,要求:[“_locale”= >“en | fr”,“_format”= >“html | xml”,],)]公共函数搜索():响应{}} 1 2 3 4 5 6 7 8 9 #配置/ routes.yamlarticle_search:路径:/文章/ {_locale} /搜索。{_format}控制器:控制器应用\ \ ArticleController:搜索地区:在格式:超文本标记语言要求:_locale:在| fr_format:html | xml 12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <!——config/routes.xml——> .xml<??> . xml version="1.0" encoding="UTF-8"<路线xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/routing”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/routing //www.oldmanjams.com/schema/routing/routing-1.0.xsd”><路线id=“article_search”路径=" / / {_locale} /搜索文章。{_format}”控制器=“应用程序控制器\ \ ArticleController:搜索”语言环境=“en”格式=“html”><要求关键=“_locale”>在| fr要求><要求关键=“_format”>html | xml要求>路线>路线> 12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 / /配置/ routes.php名称空间欧宝娱乐app下载地址\组件\路由\加载程序\配置器;使用应用程序\控制器\ArticleController;返回函数(RoutingConfigurator$路线){$路线->add (“article_show”,' / / {_locale} /搜索文章。{_format}’)->控制器([ArticleController::类,“搜索”])->语言环境(“en”)->格式(“html”)->需求([“_locale”= >“en | fr”,“_format”= >“html | xml”,]);}; 违约路由的选项,您可以选择定义路由配置中不包含的参数。这对于将额外的参数传递给路由控制器非常有用: 属性 YAML XML PHP 12 3 4 5 6 7 8 9 10 11 12 13 14 15 / / src /控制器/ BlogController.php名称空间应用程序\控制器;使用欧宝娱乐app下载地址\包\FrameworkBundle\控制器\AbstractController;使用欧宝娱乐app下载地址\组件\HttpFoundation\响应;使用欧宝娱乐app下载地址\组件\路由\注释\路线;类BlogController扩展AbstractController{#(路线(“/博客/{页面}”,名字:“blog_index”,默认值:[“页面”= > 1,'标题' = > ' Hello world ! ']))公共函数指数(int$页面、字符串$标题):响应{/ /……}} 1 2 3 4 5 6 7 #配置/ routes.yamlblog_index:路径:页面/博客/ {}控制器:控制器应用\ \ BlogController:索引默认值:页面:1标题:“Hello world !” 12 3 4 5 6 7 8 9 10 11 12 <!——config/routes.xml——> .xml<??> . xml version="1.0" encoding="UTF-8"<路线xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/routing”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/routing //www.oldmanjams.com/schema/routing/routing-1.0.xsd”><路线id=“blog_index”路径=“/博客/{页面}”控制器=“应用程序控制器\ \ BlogController:指数”><默认的关键=“页面”>1默认的><默认的关键=“标题”>你好世界!默认的>路线>路线> 12 3 4 5 6 7 8 9 10 11 12 13 / /配置/ routes.php使用应用程序\控制器\BlogController;使用欧宝娱乐app下载地址\组件\路由\加载程序\配置器\RoutingConfigurator;返回函数(RoutingConfigurator$路线){$路线->add (“blog_index”,“/博客/{页面}”)->控制器([BlogController::类,“指数”])->违约([“页面”= >1,“标题”= >“Hello world !”,]);}; /斜杠字符,因为这是用来分隔url不同部分的字符。例如,如果令牌的价值/分享/{牌}路由包含/字符,这条路线不匹配。 一个可能的解决方案是改变参数要求,使其更宽松: 属性 YAML XML PHP 12 3 4 5 6 7 8 9 10 11 12 13 14 15 / / src /控制器/ DefaultController.php名称空间应用程序\控制器;使用欧宝娱乐app下载地址\包\FrameworkBundle\控制器\AbstractController;使用欧宝娱乐app下载地址\组件\HttpFoundation\响应;使用欧宝娱乐app下载地址\组件\路由\注释\路线;类DefaultController扩展AbstractController{#(路线(“/分享/{牌}”,名字:“分享”,要求:['牌 ' => '.+'])]公共函数分享($令牌):响应{/ /……}} 1 2 3 4 5 6 #配置/ routes.yaml分享:路径:/分享/{牌}控制器:控制器应用\ \ DefaultController::分享要求:令牌:.+ 1 2 3 4 5 6 7 8 9 10 11 <!——config/routes.xml——> .xml<??> . xml version="1.0" encoding="UTF-8"<路线xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/routing”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/routing //www.oldmanjams.com/schema/routing/routing-1.0.xsd”><路线id=“共享”路径=“/分享/{牌}”控制器=“应用程序控制器\ \ DefaultController:分享”><要求关键=“令牌”>.+要求>路线>路线> 12 3 4 5 6 7 8 9 10 11 12 / /配置/ routes.php使用应用程序\控制器\DefaultController;使用欧宝娱乐app下载地址\组件\路由\加载程序\配置器\RoutingConfigurator;返回函数(RoutingConfigurator$路线){$路线->add (“分享”,“/分享/{牌}”)->控制器([DefaultController::类,“分享”])->需求([“令牌”= >“+”。,]);}; 请注意 如果路由定义了几个参数,并且将这个允许的正则表达式应用于所有这些参数,则可能会得到意想不到的结果。例如,如果路由定义为/分享/ {path} /{牌}和两个路径而且令牌接受/,然后令牌将只得到最后一部分,其余的是匹配路径. 请注意 如果路线包含特价{_format}参数时,不应该使用.+允许斜杠的参数的要求。例如,如果模式是/分享/{牌}{_format}。而且{牌}允许任何字符/ / foo / bar.json分享URL会考虑foo / bar.json作为令牌,格式将为空。这可以通过替换.+要求的[^] +允许除点以外的任何字符。 YAML XML PHP 1 2 3 #配置/ routes.yamlnew_route_name:别名:original_route_name 1 2 3 4 5 6 7 8 9 <!——config/routes.xml——> .xml<??> . xml version="1.0" encoding="UTF-8"<路线xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/routing”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/routing //www.oldmanjams.com/schema/routing/routing-1.0.xsd”><路线id=“new_route_name”别名=“original_route_name”/>路线> 1 2 3 4 5 6 / /配置/ routes.php使用欧宝娱乐app下载地址\组件\路由\加载程序\配置器\RoutingConfigurator;返回函数(RoutingConfigurator$路线){$路线->别名(“new_route_name”,“original_route_name”);}; 在这个例子中,两者都是original_route_name而且new_route_name路由可以在应用程序中使用,并将产生相同的结果。 YAML XML PHP 12 3 4 5 6 7 8 9 10 11 12 13 14 new_route_name:别名:original_route_name#输出以下通用弃用消息:#自acme/package 1.2起:“new_route_name”路由别名已弃用。您应该停止使用它,因为它将在未来被删除。弃用:包:“acme /包”版本:“1.2”#你也可以定义一个自定义的弃用消息(%alias_id%占位符可用)弃用:包:“acme /包”版本:“1.2”信息:“%alias_id%”路由别名已弃用。不要再用了。” 12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <??> . xml version="1.0" encoding="UTF-8"<路线xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/routing”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/routing //www.oldmanjams.com/schema/routing/routing-1.0.xsd”><路线id=“new_route_name”别名=“original_route_name”><!自acme/package 1.2以来:“new_route_name”路由别名已弃用。您应该停止使用它,因为它将在未来被删除。--><弃用包=“acme /包”版本=“1.2”/><!——你也可以定义一个自定义的弃用消息(%alias_id%占位符可用)——><弃用包=“acme /包”版本=“1.2”>不建议使用“%alias_id%”路由别名。不要再用了。弃用>路线>路线> 12 3 4 5 6 7 8 9 10 11 12 $路线->别名(“new_route_name”,“original_route_name”)//输出以下通用弃用消息://由于acme/package 1.2:“new_route_name”路由别名已弃用。您应该停止使用它,因为它将在未来被删除。->反对(“acme /包”,“1.2”,”)//你也可以定义一个自定义的弃用消息(%alias_id%占位符可用)->反对(“acme /包”,“1.2”,“%alias_id%”路由别名已弃用。不要再用了。”); 在这个例子中,每次new_route_name如果使用了别名,则会触发deprecation警告,建议您停止使用该别名。 消息实际上是一个消息模板,用于替换出现的% alias_id %由路由别名指定的占位符。你必须至少发生过一次% alias_id %模板中的占位符。