路由
编辑本页控制器动作生成响应。路由配置定义为每个传入URL运行哪个操作。它还提供了其他有用的功能,比如生成seo友好的url(例如。/读/ intro-to-syob娱乐下载mfony
而不是index . php ?article_id = 57
).
ob娱乐下载Symfony推荐属性因为把路由和控制器放在同一个地方很方便。
控制器与这些路由相关联。属性在PHP 8及更高版本中是原生的,因此您可以立即使用它们。
在使用它们之前,您需要向项目添加一些配置。如果您的项目使用ob娱乐下载Symfony Flex,该文件已经为您创建。否则,手动创建以下文件:
1 2 3 4 5 6 7 8 9 10
#配置/线路/ attributes.yaml控制器:资源:路径:. . / . . / src /控制器/名称空间:App \控制器类型:属性内核:资源:App \内核类型:属性
属性中声明的类上的属性定义的路由ob娱乐下载App \控制器
命名空间,并存储在src /控制器/
目录,遵循PSR-4标准。内核也可以充当控制器,这对于使用Symfony作为微框架的小型应用程序特别有用。ob娱乐下载
6.2
从PSR-4名称空间根导入路由的特性是在Symfony 6.2中引入的。ob娱乐下载
类定义路由/博客
URL在您的应用程序。为此,创建一个控制器类像下面这样:
- 属性
12 3 4 5 6 7 8 9 10 11 12 13 14
/ / src /控制器/ BlogController.php名称空间应用程序\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\路由\注释\路线;类BlogController扩展AbstractController{#[Route('/blog', name: 'blog_list')]公共函数列表():响应{/ /……}}
这个配置定义了一个名为blog_list
属性时匹配的/博客
URL。匹配发生时,应用程序将运行列表()
方法BlogController
类。
请注意
匹配路由时不考虑URL的查询字符串。在这个例子中,url像/博客吗?foo = bar
而且/博客吗?foo = bar bar = foo
也将匹配blog_list
路线。
谨慎
如果在同一个文件中定义多个PHP类,Symfony只加载第一个类的路由,而忽略所有其他路由。ob娱乐下载
路由名称(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
请注意
默认情况下,Symfoob娱乐下载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):响应{/ /……编辑一篇文章}}
提示
HTML表单只支持得到
而且帖子
方法。如果您正在使用与HTML表单不同的方法调用路由,请添加一个名为_method
用方法使用(例如:
).如果您使用ob娱乐下载Symfony的形式这将自动为您完成framework.http_method_override选择是真正的
.
条件选项,如果你需要一些路由匹配基于一些任意的匹配逻辑:
- 属性
- YAML
- XML
- PHP
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 27 28 29 30 31 32
/ / src /控制器/ DefaultController.php名称空间应用程序\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\路由\注释\路线;类DefaultController扩展AbstractController{#(路线(' /接触'名称:“接触”条件:"context.getMethod() in ['GET', 'HEAD'] and request.headers.get('User-Agent') match '/firefox/i'",//表达式也可以包含配置参数://条件:"request.headers.get('User-Agent')匹配'%app. allowed_浏览器%'")]公共函数联系():响应{/ /……}#(路线(“/文章/ {id}”名称:“post_show”,//表达式可以使用"params"变量获取路由参数值条件:"params['id'] < 1000")]公共函数showPost(int$id):响应{/ /……返回一个JSON响应}}
的值条件
选项是任何有效的ExpressionLanguage表达式并且可以使用Symfony创建的这些变量:ob娱乐下载
-
上下文
-
的一个实例RequestContext,它包含了关于被匹配路由的最基本信息。
-
请求
-
的ob娱乐下载Symfony的请求对象,表示当前请求。
-
参数个数
-
匹配的数组线路参数用于当前路由。
6.1
的参数个数
变量在Symfony 6.1中引入。ob娱乐下载
你也可以使用这些函数:
-
env(字符串名称)美元
-
返回变量的值环境变量处理器
-
服务(字符串$别名)
-
返回路由条件服务。
首先,添加# (AsRoutingConditionService)
属性或routing.condition_service
标记到你想在路由条件中使用的服务:
1 2 3 4 5 6 7 8 9 10 11
使用ob娱乐下载\包\FrameworkBundle\路由\属性\AsRoutingConditionService;使用ob娱乐下载\组件\HttpFoundation\请求;# (AsRoutingConditionService(别名:route_checker)]类RouteChecker{公共函数检查(请求$请求):保龄球{/ /……}}
然后,使用服务()
函数在条件中引用该服务:
1 2 3 4
//控制器(使用别名):#(路线(条件:“服务(route_checker)支票(请求)))//或不带别名:#[路线(条件:“服务(“美联社服务\ \ \ \ \ \ RouteChecker ')支票(请求)))
6.1
的服务(字符串$别名)
功能和# (AsRoutingConditionService)
属性在Symfony 6.1中引入。ob娱乐下载
在幕后,表达式被编译为原始PHP。正因为如此,使用条件
除了底层PHP执行所需的时间之外,key不会造成额外的开销。
谨慎
条件是不 在生成url时考虑(本文后面将对此进行解释)。
/博客).然而,通常在定义路由时,有些部分是可变的。例如,显示一些博客文章的URL可能包括标题或段(例如:/博客/第一篇博客
或/博客/ all-about-sob娱乐下载ymfony
).
在Syob娱乐下载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名称空间应用程序\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\路由\注释\路线;类BlogController扩展AbstractController{/ /……#[Route('/blog/{slug}', name: 'blog_show')]公共函数显示(字符串$鼻涕虫):响应{// $slug将等于URL的动态部分//例如:at /blog/ ay-routing,那么$slug=' ay-routing'/ /……}}
变量部分的名称({蛞蝓}
(在本例中)用于创建一个PHP变量,路由内容存储在其中并传递给控制器。如果用户访问/博客/第一篇博客
URL, ob娱乐下载Symfony执行显示()
方法中的BlogController
类,并传递$slug = 'my-first-post'
的参数显示()
方法。
路由可以定义任意数量的参数,但是每个参数只能在每条路由上使用一次。/博客/关于-{类别}/页面/ {pageNumber}
).
blog_show路线(网址:/博客/{蛞蝓}
)和ablog_list
路线(网址:页面/博客/ {}
).如果路由参数接受任何值,就无法区分这两条路由。
如果用户请求/博客/第一篇博客
,两条路由将匹配,Symfony将使用先定义的路由。ob娱乐下载方法中添加一些验证即可解决此问题{页面}
参数使用需求
选择:
- 属性
- 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名称空间应用程序\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\路由\注释\路线;类BlogController扩展AbstractController{#(路线(“/博客/{页面}”,名字:“blog_list”,要求:['页' = > ' \ d + ']))公共函数列表(int$页面):响应{/ /……}#[Route('/blog/{slug}', name: 'blog_show')]公共函数显示($鼻涕虫):响应{/ /……}}
的需求
选项定义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名称空间应用程序\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\路由\注释\路线;类BlogController扩展AbstractController{#[Route('/blog/{page<\d+>}', name: 'blog_list')]公共函数列表(int$页面):响应{/ /……}}
现在,保持前面的路由配置,但是改变控制器动作的参数。而不是字符串$蛞蝓
,添加BlogPost美元后
:
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20
/ / src /控制器/ BlogController.php名称空间应用程序\控制器;使用应用程序\实体\博客;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\路由\注释\路线;类BlogController扩展AbstractController{/ /……#[Route('/blog/{slug}', name: 'blog_show')]公共函数显示(博客$帖子):响应{// $post是slug匹配路由参数的对象/ /……}}
如果你的控制器参数包含对象的类型提示(博客
在这种情况下),“参数转换器”发出一个数据库请求,使用请求参数(鼻涕虫
在这种情况下)。如果没有找到对象,Symfony将自动生成40ob娱乐下载4响应。
读了完整的参数转换器文档欧宝官网下载app了解Symfony提供的转换器以及如何配置它们。ob娱乐下载
-
_controller
-
该参数用于确定路由匹配时执行哪个控制器和动作。
-
_format
-
的“请求格式”
请求
对象。这用于设置内容类型
的响应(例如ajson
格式转换为内容类型
的application / json
).
-
_fragment
-
用于设置片段标识符,该标识符是以。开头的URL的可选最后一部分
#
字符,用于标识文档的一部分。
-
_locale
-
用于设置语言环境根据要求。
您可以包含这些属性(除了_fragment
)在单个路由和路由导入中。ob娱乐下载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”,],)]公共函数搜索():响应{}}
ob娱乐下载Symfony推荐属性因为把路由和控制器放在同一个地方很方便。
控制器与这些路由相关联。属性在PHP 8及更高版本中是原生的,因此您可以立即使用它们。
在使用它们之前,您需要向项目添加一些配置。如果您的项目使用ob娱乐下载Symfony Flex,该文件已经为您创建。否则,手动创建以下文件:
1 2 3 4 5 6 7 8 9 10
#配置/线路/ attributes.yaml控制器:资源:路径:. . / . . / src /控制器/名称空间:App \控制器类型:属性内核:资源:App \内核类型:属性
属性中声明的类上的属性定义的路由ob娱乐下载App \控制器
命名空间,并存储在src /控制器/
目录,遵循PSR-4标准。内核也可以充当控制器,这对于使用Symfony作为微框架的小型应用程序特别有用。ob娱乐下载
6.2
从PSR-4名称空间根导入路由的特性是在Symfony 6.2中引入的。ob娱乐下载
类定义路由/博客
URL在您的应用程序。为此,创建一个控制器类像下面这样:
- 属性
12 3 4 5 6 7 8 9 10 11 12 13 14
/ / src /控制器/ BlogController.php名称空间应用程序\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\路由\注释\路线;类BlogController扩展AbstractController{#[Route('/blog', name: 'blog_list')]公共函数列表():响应{/ /……}}
这个配置定义了一个名为blog_list
属性时匹配的/博客
URL。匹配发生时,应用程序将运行列表()
方法BlogController
类。
请注意
匹配路由时不考虑URL的查询字符串。在这个例子中,url像/博客吗?foo = bar
而且/博客吗?foo = bar bar = foo
也将匹配blog_list
路线。
谨慎
如果在同一个文件中定义多个PHP类,Symfony只加载第一个类的路由,而忽略所有其他路由。ob娱乐下载
路由名称(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
请注意
默认情况下,Symfoob娱乐下载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):响应{/ /……编辑一篇文章}}
提示
HTML表单只支持得到
而且帖子
方法。如果您正在使用与HTML表单不同的方法调用路由,请添加一个名为_method
用方法使用(例如:
).如果您使用ob娱乐下载Symfony的形式这将自动为您完成framework.http_method_override选择是真正的
.
条件选项,如果你需要一些路由匹配基于一些任意的匹配逻辑:
- 属性
- YAML
- XML
- PHP
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 27 28 29 30 31 32
/ / src /控制器/ DefaultController.php名称空间应用程序\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\路由\注释\路线;类DefaultController扩展AbstractController{#(路线(' /接触'名称:“接触”条件:"context.getMethod() in ['GET', 'HEAD'] and request.headers.get('User-Agent') match '/firefox/i'",//表达式也可以包含配置参数://条件:"request.headers.get('User-Agent')匹配'%app. allowed_浏览器%'")]公共函数联系():响应{/ /……}#(路线(“/文章/ {id}”名称:“post_show”,//表达式可以使用"params"变量获取路由参数值条件:"params['id'] < 1000")]公共函数showPost(int$id):响应{/ /……返回一个JSON响应}}
的值条件
选项是任何有效的ExpressionLanguage表达式并且可以使用Symfony创建的这些变量:ob娱乐下载
-
上下文
-
的一个实例RequestContext,它包含了关于被匹配路由的最基本信息。
-
请求
-
的ob娱乐下载Symfony的请求对象,表示当前请求。
-
参数个数
-
匹配的数组线路参数用于当前路由。
6.1
的参数个数
变量在Symfony 6.1中引入。ob娱乐下载
你也可以使用这些函数:
-
env(字符串名称)美元
-
返回变量的值环境变量处理器
-
服务(字符串$别名)
-
返回路由条件服务。
首先,添加# (AsRoutingConditionService)
属性或routing.condition_service
标记到你想在路由条件中使用的服务:
1 2 3 4 5 6 7 8 9 10 11
使用ob娱乐下载\包\FrameworkBundle\路由\属性\AsRoutingConditionService;使用ob娱乐下载\组件\HttpFoundation\请求;# (AsRoutingConditionService(别名:route_checker)]类RouteChecker{公共函数检查(请求$请求):保龄球{/ /……}}
然后,使用服务()
函数在条件中引用该服务:
1 2 3 4
//控制器(使用别名):#(路线(条件:“服务(route_checker)支票(请求)))//或不带别名:#[路线(条件:“服务(“美联社服务\ \ \ \ \ \ RouteChecker ')支票(请求)))
6.1
的服务(字符串$别名)
功能和# (AsRoutingConditionService)
属性在Symfony 6.1中引入。ob娱乐下载
在幕后,表达式被编译为原始PHP。正因为如此,使用条件
除了底层PHP执行所需的时间之外,key不会造成额外的开销。
谨慎
条件是不 在生成url时考虑(本文后面将对此进行解释)。
控制器与这些路由相关联。属性在PHP 8及更高版本中是原生的,因此您可以立即使用它们。
在使用它们之前,您需要向项目添加一些配置。如果您的项目使用ob娱乐下载Symfony Flex,该文件已经为您创建。否则,手动创建以下文件:
1 2 3 4 5 6 7 8 9 10
#配置/线路/ attributes.yaml控制器:资源:路径:. . / . . / src /控制器/名称空间:App \控制器类型:属性内核:资源:App \内核类型:属性
属性中声明的类上的属性定义的路由ob娱乐下载App \控制器
命名空间,并存储在src /控制器/
目录,遵循PSR-4标准。内核也可以充当控制器,这对于使用Symfony作为微框架的小型应用程序特别有用。ob娱乐下载
6.2
从PSR-4名称空间根导入路由的特性是在Symfony 6.2中引入的。ob娱乐下载
类定义路由/博客
URL在您的应用程序。为此,创建一个控制器类像下面这样:
- 属性
12 3 4 5 6 7 8 9 10 11 12 13 14
/ / src /控制器/ BlogController.php名称空间应用程序\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\路由\注释\路线;类BlogController扩展AbstractController{#[Route('/blog', name: 'blog_list')]公共函数列表():响应{/ /……}}
这个配置定义了一个名为blog_list
属性时匹配的/博客
URL。匹配发生时,应用程序将运行列表()
方法BlogController
类。
请注意
匹配路由时不考虑URL的查询字符串。在这个例子中,url像/博客吗?foo = bar
而且/博客吗?foo = bar bar = foo
也将匹配blog_list
路线。
谨慎
如果在同一个文件中定义多个PHP类,Symfony只加载第一个类的路由,而忽略所有其他路由。ob娱乐下载
路由名称(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
请注意
默认情况下,Symfoob娱乐下载ny只加载以YAML格式定义的路由。如果用XML和/或PHP格式定义路由,则需要这样做更新src/Kernel.php文件.
- 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
请注意
默认情况下,Symfoob娱乐下载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):响应{/ /……编辑一篇文章}}
提示
HTML表单只支持得到
而且帖子
方法。如果您正在使用与HTML表单不同的方法调用路由,请添加一个名为_method
用方法使用(例如:
).如果您使用ob娱乐下载Symfony的形式这将自动为您完成framework.http_method_override选择是真正的
.
- 属性
- 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):响应{/ /……编辑一篇文章}}
提示
HTML表单只支持得到
而且帖子
方法。如果您正在使用与HTML表单不同的方法调用路由,请添加一个名为_method
用方法使用(例如:).如果您使用ob娱乐下载Symfony的形式这将自动为您完成framework.http_method_override选择是
真正的
.
条件选项,如果你需要一些路由匹配基于一些任意的匹配逻辑:
- 属性
- YAML
- XML
- PHP
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 27 28 29 30 31 32
/ / src /控制器/ DefaultController.php名称空间应用程序\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\路由\注释\路线;类DefaultController扩展AbstractController{#(路线(' /接触'名称:“接触”条件:"context.getMethod() in ['GET', 'HEAD'] and request.headers.get('User-Agent') match '/firefox/i'",//表达式也可以包含配置参数://条件:"request.headers.get('User-Agent')匹配'%app. allowed_浏览器%'")]公共函数联系():响应{/ /……}#(路线(“/文章/ {id}”名称:“post_show”,//表达式可以使用"params"变量获取路由参数值条件:"params['id'] < 1000")]公共函数showPost(int$id):响应{/ /……返回一个JSON响应}}
的值条件
选项是任何有效的ExpressionLanguage表达式并且可以使用Symfony创建的这些变量:ob娱乐下载
-
上下文
-
的一个实例RequestContext,它包含了关于被匹配路由的最基本信息。
-
请求
-
的ob娱乐下载Symfony的请求对象,表示当前请求。
-
参数个数
-
匹配的数组线路参数用于当前路由。
6.1
的参数个数
变量在Symfony 6.1中引入。ob娱乐下载
你也可以使用这些函数:
-
env(字符串名称)美元
-
返回变量的值环境变量处理器
-
服务(字符串$别名)
-
返回路由条件服务。
首先,添加# (AsRoutingConditionService)
属性或routing.condition_service
标记到你想在路由条件中使用的服务:
1 2 3 4 5 6 7 8 9 10 11
使用ob娱乐下载\包\FrameworkBundle\路由\属性\AsRoutingConditionService;使用ob娱乐下载\组件\HttpFoundation\请求;# (AsRoutingConditionService(别名:route_checker)]类RouteChecker{公共函数检查(请求$请求):保龄球{/ /……}}
然后,使用服务()
函数在条件中引用该服务:
1 2 3 4
//控制器(使用别名):#(路线(条件:“服务(route_checker)支票(请求)))//或不带别名:#[路线(条件:“服务(“美联社服务\ \ \ \ \ \ RouteChecker ')支票(请求)))
6.1
的服务(字符串$别名)
功能和# (AsRoutingConditionService)
属性在Symfony 6.1中引入。ob娱乐下载
在幕后,表达式被编译为原始PHP。正因为如此,使用条件
除了底层PHP执行所需的时间之外,key不会造成额外的开销。
谨慎
条件是不 在生成url时考虑(本文后面将对此进行解释)。
- 属性
- YAML
- XML
- PHP
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 27 28 29 30 31 32
/ / src /控制器/ DefaultController.php名称空间应用程序\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\路由\注释\路线;类DefaultController扩展AbstractController{#(路线(' /接触'名称:“接触”条件:"context.getMethod() in ['GET', 'HEAD'] and request.headers.get('User-Agent') match '/firefox/i'",//表达式也可以包含配置参数://条件:"request.headers.get('User-Agent')匹配'%app. allowed_浏览器%'")]公共函数联系():响应{/ /……}#(路线(“/文章/ {id}”名称:“post_show”,//表达式可以使用"params"变量获取路由参数值条件:"params['id'] < 1000")]公共函数showPost(int$id):响应{/ /……返回一个JSON响应}}
条件
选项是任何有效的ExpressionLanguage表达式并且可以使用Symfony创建的这些变量:ob娱乐下载上下文
请求
参数个数
6.1
的参数个数
变量在Symfony 6.1中引入。ob娱乐下载
env(字符串名称)美元
服务(字符串$别名)
返回路由条件服务。
首先,添加# (AsRoutingConditionService)
属性或routing.condition_service
标记到你想在路由条件中使用的服务:
1 2 3 4 5 6 7 8 9 10 11
使用ob娱乐下载\包\FrameworkBundle\路由\属性\AsRoutingConditionService;使用ob娱乐下载\组件\HttpFoundation\请求;# (AsRoutingConditionService(别名:route_checker)]类RouteChecker{公共函数检查(请求$请求):保龄球{/ /……}}
然后,使用服务()
函数在条件中引用该服务:
1 2 3 4
//控制器(使用别名):#(路线(条件:“服务(route_checker)支票(请求)))//或不带别名:#[路线(条件:“服务(“美联社服务\ \ \ \ \ \ RouteChecker ')支票(请求)))
6.1
的服务(字符串$别名)
功能和# (AsRoutingConditionService)
属性在Symfony 6.1中引入。ob娱乐下载
条件
除了底层PHP执行所需的时间之外,key不会造成额外的开销。谨慎
条件是
/博客).然而,通常在定义路由时,有些部分是可变的。例如,显示一些博客文章的URL可能包括标题或段(例如:/博客/第一篇博客
或/博客/ all-about-sob娱乐下载ymfony
).
在Syob娱乐下载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名称空间应用程序\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\路由\注释\路线;类BlogController扩展AbstractController{/ /……#[Route('/blog/{slug}', name: 'blog_show')]公共函数显示(字符串$鼻涕虫):响应{// $slug将等于URL的动态部分//例如:at /blog/ ay-routing,那么$slug=' ay-routing'/ /……}}
变量部分的名称({蛞蝓}
(在本例中)用于创建一个PHP变量,路由内容存储在其中并传递给控制器。如果用户访问/博客/第一篇博客
URL, ob娱乐下载Symfony执行显示()
方法中的BlogController
类,并传递$slug = 'my-first-post'
的参数显示()
方法。
路由可以定义任意数量的参数,但是每个参数只能在每条路由上使用一次。/博客/关于-{类别}/页面/ {pageNumber}
).
blog_show路线(网址:/博客/{蛞蝓}
)和ablog_list
路线(网址:页面/博客/ {}
).如果路由参数接受任何值,就无法区分这两条路由。
如果用户请求/博客/第一篇博客
,两条路由将匹配,Symfony将使用先定义的路由。ob娱乐下载方法中添加一些验证即可解决此问题{页面}
参数使用需求
选择:
- 属性
- 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名称空间应用程序\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\路由\注释\路线;类BlogController扩展AbstractController{#(路线(“/博客/{页面}”,名字:“blog_list”,要求:['页' = > ' \ d + ']))公共函数列表(int$页面):响应{/ /……}#[Route('/blog/{slug}', name: 'blog_show')]公共函数显示($鼻涕虫):响应{/ /……}}
的需求
选项定义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名称空间应用程序\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\路由\注释\路线;类BlogController扩展AbstractController{#[Route('/blog/{page<\d+>}', name: 'blog_list')]公共函数列表(int$页面):响应{/ /……}}
现在,保持前面的路由配置,但是改变控制器动作的参数。而不是字符串$蛞蝓
,添加BlogPost美元后
:
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20
/ / src /控制器/ BlogController.php名称空间应用程序\控制器;使用应用程序\实体\博客;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\路由\注释\路线;类BlogController扩展AbstractController{/ /……#[Route('/blog/{slug}', name: 'blog_show')]公共函数显示(博客$帖子):响应{// $post是slug匹配路由参数的对象/ /……}}
如果你的控制器参数包含对象的类型提示(博客
在这种情况下),“参数转换器”发出一个数据库请求,使用请求参数(鼻涕虫
在这种情况下)。如果没有找到对象,Symfony将自动生成40ob娱乐下载4响应。
读了完整的参数转换器文档欧宝官网下载app了解Symfony提供的转换器以及如何配置它们。ob娱乐下载
{…}
他们必须有一个唯一的名字。例如,显示博客文章内容的路由定义为/博客/{蛞蝓}
:- 属性
- YAML
- XML
- PHP
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20
/ / src /控制器/ BlogController.php名称空间应用程序\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\路由\注释\路线;类BlogController扩展AbstractController{/ /……#[Route('/blog/{slug}', name: 'blog_show')]公共函数显示(字符串$鼻涕虫):响应{// $slug将等于URL的动态部分//例如:at /blog/ ay-routing,那么$slug=' ay-routing'/ /……}}
{蛞蝓}
(在本例中)用于创建一个PHP变量,路由内容存储在其中并传递给控制器。如果用户访问/博客/第一篇博客
URL, ob娱乐下载Symfony执行显示()
方法中的BlogController
类,并传递$slug = 'my-first-post'
的参数显示()
方法。/博客/关于-{类别}/页面/ {pageNumber}
).blog_show路线(网址:/博客/{蛞蝓}
)和ablog_list
路线(网址:页面/博客/ {}
).如果路由参数接受任何值,就无法区分这两条路由。
如果用户请求/博客/第一篇博客
,两条路由将匹配,Symfony将使用先定义的路由。ob娱乐下载方法中添加一些验证即可解决此问题{页面}
参数使用需求
选择:
- 属性
- 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名称空间应用程序\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\路由\注释\路线;类BlogController扩展AbstractController{#(路线(“/博客/{页面}”,名字:“blog_list”,要求:['页' = > ' \ d + ']))公共函数列表(int$页面):响应{/ /……}#[Route('/blog/{slug}', name: 'blog_show')]公共函数显示($鼻涕虫):响应{/ /……}}
的需求
选项定义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名称空间应用程序\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\路由\注释\路线;类BlogController扩展AbstractController{#[Route('/blog/{page<\d+>}', name: 'blog_list')]公共函数列表(int$页面):响应{/ /……}}
/博客/第一篇博客
,两条路由将匹配,Symfony将使用先定义的路由。ob娱乐下载方法中添加一些验证即可解决此问题{页面}
参数使用需求
选择:- 属性
- 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名称空间应用程序\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\路由\注释\路线;类BlogController扩展AbstractController{#(路线(“/博客/{页面}”,名字:“blog_list”,要求:['页' = > ' \ d + ']))公共函数列表(int$页面):响应{/ /……}#[Route('/blog/{slug}', name: 'blog_show')]公共函数显示($鼻涕虫):响应{/ /……}}
需求
选项定义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名称空间应用程序\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\路由\注释\路线;类BlogController扩展AbstractController{#[Route('/blog/{page<\d+>}', name: 'blog_list')]公共函数列表(int$页面):响应{/ /……}}
字符串$蛞蝓
,添加BlogPost美元后
:12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20
/ / src /控制器/ BlogController.php名称空间应用程序\控制器;使用应用程序\实体\博客;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\路由\注释\路线;类BlogController扩展AbstractController{/ /……#[Route('/blog/{slug}', name: 'blog_show')]公共函数显示(博客$帖子):响应{// $post是slug匹配路由参数的对象/ /……}}
博客
在这种情况下),“参数转换器”发出一个数据库请求,使用请求参数(鼻涕虫
在这种情况下)。如果没有找到对象,Symfony将自动生成40ob娱乐下载4响应。
-
_controller
-
该参数用于确定路由匹配时执行哪个控制器和动作。
-
_format
-
的“请求格式”
请求
对象。这用于设置内容类型
的响应(例如ajson
格式转换为内容类型
的application / json
).
-
_fragment
-
用于设置片段标识符,该标识符是以。开头的URL的可选最后一部分
#
字符,用于标识文档的一部分。
-
_locale
-
用于设置语言环境根据要求。
您可以包含这些属性(除了_fragment
)在单个路由和路由导入中。ob娱乐下载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”,],)]公共函数搜索():响应{}}
_controller
_format
请求
对象。这用于设置内容类型
的响应(例如ajson
格式转换为内容类型
的application / json
)._fragment
#
字符,用于标识文档的一部分。_locale
_fragment
)在单个路由和路由导入中。ob娱乐下载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”,],)]公共函数搜索():响应{}}
在这个例子中,两者都是original_route_name
而且new_route_name
路由可以在应用程序中使用,并将产生相同的结果。
在这个例子中,每次new_route_name
如果使用了别名,则会触发deprecation警告,建议您停止使用该别名。
消息实际上是一个消息模板,用于替换出现的% alias_id %
由路由别名指定的占位符。你必须至少发生过一次% alias_id %
模板中的占位符。
/博客这就是为什么Symfonyob娱乐下载包含了共享路由配置的功能。
将路由定义为属性时,将公共配置放在#(路线)
控制器类的属性。在其他路由格式中,在引入路由时使用选项定义公共配置。
- 属性
- YAML
- XML
- PHP
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22
/ / src /控制器/ BlogController.php名称空间应用程序\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\路由\注释\路线;#(路线(“/博客”,要求:[' _locale ' = > ' en | es | fr '],名字:“blog_”))类BlogController扩展AbstractController{#[Route('/{_locale}', name: 'index')]公共函数指数():响应{/ /……}#[路由('/{_locale}/posts/{slug}', name: 'show')]公共函数显示(字符串$鼻涕虫):响应{/ /……}}
的路由index ()
Action将被调用blog_index
它的URL将是/博客/ {_locale}
.的路线显示()
Action将被调用blog_show
它的URL将是/博客/ {_locale} /文章/{蛞蝓}
.这两个路由还将验证_locale
参数匹配类注释中定义的正则表达式。
请注意
如果任何带前缀的路由定义了一个空路径,Symfony将在其后面添加一个斜杠。ob娱乐下载在前面的例子中,一个空路径前缀为/博客
将导致/博客/
URL。如果要避免此行为,请设置trailing_slash_on_root
选项假
(当使用PHP属性或注释时,此选项不可用):
- YAML
- XML
- PHP
1 2 3 4 5 6 7
#配置/线路/ annotations.yaml控制器:资源:“. . / . . / src /控制器/”类型:注释前缀:“/博客”trailing_slash_on_root:假#……
另请参阅
ob娱乐下载Symfony可以从不同的源导入路由你甚至可以创建自己的路由加载器。
#(路线)
控制器类的属性。在其他路由格式中,在引入路由时使用选项定义公共配置。- 属性
- YAML
- XML
- PHP
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22
/ / src /控制器/ BlogController.php名称空间应用程序\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\路由\注释\路线;#(路线(“/博客”,要求:[' _locale ' = > ' en | es | fr '],名字:“blog_”))类BlogController扩展AbstractController{#[Route('/{_locale}', name: 'index')]公共函数指数():响应{/ /……}#[路由('/{_locale}/posts/{slug}', name: 'show')]公共函数显示(字符串$鼻涕虫):响应{/ /……}}
index ()
Action将被调用blog_index
它的URL将是/博客/ {_locale}
.的路线显示()
Action将被调用blog_show
它的URL将是/博客/ {_locale} /文章/{蛞蝓}
.这两个路由还将验证_locale
参数匹配类注释中定义的正则表达式。请注意
如果任何带前缀的路由定义了一个空路径,Symfony将在其后面添加一个斜杠。ob娱乐下载在前面的例子中,一个空路径前缀为/博客
将导致/博客/
URL。如果要避免此行为,请设置trailing_slash_on_root
选项假
(当使用PHP属性或注释时,此选项不可用):
- YAML
- XML
- PHP
1 2 3 4 5 6 7
#配置/线路/ annotations.yaml控制器:资源:“. . / . . / src /控制器/”类型:注释前缀:“/博客”trailing_slash_on_root:假#……
另请参阅
ob娱乐下载Symfony可以从不同的源导入路由你甚至可以创建自己的路由加载器。
请求对象在“请求属性”中存储了所有路由配ob娱乐下载置(如名称和参数)。控件可以在控制器中获取此信息请求
对象:
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22
/ / src /控制器/ BlogController.php名称空间应用程序\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\HttpFoundation\请求;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\路由\注释\路线;类BlogController扩展AbstractController{#[Route('/blog', name: 'blog_list')]公共函数列表(请求$请求):响应{$routeName=$请求->属性->get (“_route”);$routeParameters=$请求->属性->get (“_route_params”);//获取所有可用的属性(不仅仅是路由属性):$allAttributes=$请求->属性->所有();/ /……}}
您也可以在服务中获得此信息request_stack
服务获取服务中的Request对象.在模板中,使用枝全局应用程序变量获取当前路由及其属性:
1 2
{%集Route_name = app.current_route %}{%集Route_parameters = app.current_route_parameters %}
6.2
的app.current_route
而且app.current_route_parameters
在Symfony 6.2中引入了变量。ob娱乐下载在你必须访问之前_route
而且_route_params
使用app.request.attributes.get ()
.
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22
/ / src /控制器/ BlogController.php名称空间应用程序\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\HttpFoundation\请求;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\路由\注释\路线;类BlogController扩展AbstractController{#[Route('/blog', name: 'blog_list')]公共函数列表(请求$请求):响应{$routeName=$请求->属性->get (“_route”);$routeParameters=$请求->属性->get (“_route_params”);//获取所有可用的属性(不仅仅是路由属性):$allAttributes=$请求->属性->所有();/ /……}}
request_stack
服务获取服务中的Request对象.在模板中,使用枝全局应用程序变量获取当前路由及其属性:1 2
{%集Route_name = app.current_route %}{%集Route_parameters = app.current_route_parameters %}
6.2
的app.current_route
而且app.current_route_parameters
在Symfony 6.2中引入了变量。ob娱乐下载在你必须访问之前_route
而且_route_params
使用app.request.attributes.get ()
.
RedirectController重定向到其他路由和url:
- YAML
- XML
- PHP
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 27
#配置/ routes.yamldoc_shortcut:路径:/医生控制器:ob娱乐下载Symfony \包\ FrameworkBundle \ \ RedirectController控制器默认值:路线:“doc_page”#可选地,您可以定义一些参数传递给路由页面:“指数”版本:“当前”#重定向在默认情况下是临时的(代码302),但你可以将它们设置为永久的(代码301)永久的:真正的在重定向时保留原始的查询字符串参数keepQueryParams:真正的在重定向时保留HTTP方法。重定向状态改变对于临时重定向,它使用307状态码而不是302对于永久重定向,它使用308状态码而不是301keepRequestMethod:真正的重定向时删除原始路由属性ignoreAttributes:真正的legacy_doc:路径:/遗留/医生控制器:ob娱乐下载Symfony \包\ FrameworkBundle \ \ RedirectController控制器默认值:#该值可以是一个绝对路径或绝对URL路径:“https://legacy.example.com/doc”永久的:真正的
提示
ob娱乐下载Symfony还提供了一些实用程序重定向内部控制器
- YAML
- XML
- PHP
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 27
#配置/ routes.yamldoc_shortcut:路径:/医生控制器:ob娱乐下载Symfony \包\ FrameworkBundle \ \ RedirectController控制器默认值:路线:“doc_page”#可选地,您可以定义一些参数传递给路由页面:“指数”版本:“当前”#重定向在默认情况下是临时的(代码302),但你可以将它们设置为永久的(代码301)永久的:真正的在重定向时保留原始的查询字符串参数keepQueryParams:真正的在重定向时保留HTTP方法。重定向状态改变对于临时重定向,它使用307状态码而不是302对于永久重定向,它使用308状态码而不是301keepRequestMethod:真正的重定向时删除原始路由属性ignoreAttributes:真正的legacy_doc:路径:/遗留/医生控制器:ob娱乐下载Symfony \包\ FrameworkBundle \ \ RedirectController控制器默认值:#该值可以是一个绝对路径或绝对URL路径:“https://legacy.example.com/doc”永久的:真正的
提示
ob娱乐下载Symfony还提供了一些实用程序重定向内部控制器
宿主选项,要求传入请求的HTTP主机与某个特定值匹配。在下面的例子中,两条路由匹配相同的路径(/
),但其中一个只响应特定的主机名:
- 属性
- YAML
- XML
- PHP
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21
/ / src /控制器/ MainController.php名称空间应用程序\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\路由\注释\路线;类MainController扩展AbstractController{#(路线(“/”,名字:“mobile_homepage”,主持人:“m.example.com”))公共函数mobileHomepage():响应{/ /……}#[路由('/',名称:'主页')]公共函数主页():响应{/ /……}}
的值宿主
选项可以包含参数(这在多租户应用程序中很有用),也可以使用需求
:
- 属性
- YAML
- XML
- PHP
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 27
/ / src /控制器/ MainController.php名称空间应用程序\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\路由\注释\路线;类MainController扩展AbstractController{#(路线(' / '名称:“mobile_homepage”主机:“.example.com{子域名}”,默认值:[“子域名”= >“米”],要求:[“子域名”= >“m |移动”),)公共函数mobileHomepage():响应{/ /……}#[路由('/',名称:'主页')]公共函数主页():响应{/ /……}}
在上面的例子中,子域名
参数定义了一个默认值,否则每次使用这些路由生成URL时都需要包含一个子域值。
提示
您还可以设置宿主
选择的时候进口航线使它们都需要该主机名。
请注意
使用子域路由时,必须设置宿主
HTTP报头功能测试或者路径不匹配:
1 2 3 4 5 6 7 8 9
$履带=$客户端->请求(“得到”,' / ', [], [], [“HTTP_HOST”= >“m.example.com”]//或者从一些配置参数中获取值:/ / [' HTTP_HOST ' = > ' m。”。客户端- > getContainer()——> getParameter(域)]);
提示
中也可以使用内联默认值和需求格式宿主
选择:{子域名m |移动> < ? m} .example.com
- 属性
- YAML
- XML
- PHP
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21
/ / src /控制器/ MainController.php名称空间应用程序\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\路由\注释\路线;类MainController扩展AbstractController{#(路线(“/”,名字:“mobile_homepage”,主持人:“m.example.com”))公共函数mobileHomepage():响应{/ /……}#[路由('/',名称:'主页')]公共函数主页():响应{/ /……}}
宿主
选项可以包含参数(这在多租户应用程序中很有用),也可以使用需求
:- 属性
- YAML
- XML
- PHP
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 27
/ / src /控制器/ MainController.php名称空间应用程序\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\路由\注释\路线;类MainController扩展AbstractController{#(路线(' / '名称:“mobile_homepage”主机:“.example.com{子域名}”,默认值:[“子域名”= >“米”],要求:[“子域名”= >“m |移动”),)公共函数mobileHomepage():响应{/ /……}#[路由('/',名称:'主页')]公共函数主页():响应{/ /……}}
子域名
参数定义了一个默认值,否则每次使用这些路由生成URL时都需要包含一个子域值。提示
您还可以设置宿主
选择的时候进口航线使它们都需要该主机名。
请注意
使用子域路由时,必须设置宿主
HTTP报头功能测试或者路径不匹配:
1 2 3 4 5 6 7 8 9
$履带=$客户端->请求(“得到”,' / ', [], [], [“HTTP_HOST”= >“m.example.com”]//或者从一些配置参数中获取值:/ / [' HTTP_HOST ' = > ' m。”。客户端- > getContainer()——> getParameter(域)]);
提示
中也可以使用内联默认值和需求格式宿主
选择:{子域名m |移动> < ? m} .example.com
翻译语言环境.这样就避免了重复路由的需要,这也减少了潜在的错误:
- 属性
- YAML
- XML
- PHP
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/ / src /控制器/ CompanyController.php名称空间应用程序\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\路由\注释\路线;类CompanyController扩展AbstractController{#(路径(路径:“en”= >' /关于我们',“问”= >' / over-ons ')名称:“about_us”)]公共函数关于():响应{/ /……}}
请注意
在为本地化路由使用PHP属性时,必须使用路径
指定路径数组的命名参数。
- 属性
- YAML
- XML
- PHP
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/ / src /控制器/ CompanyController.php名称空间应用程序\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\路由\注释\路线;类CompanyController扩展AbstractController{#(路径(路径:“en”= >' /关于我们',“问”= >' / over-ons ')名称:“about_us”)]公共函数关于():响应{/ /……}}
请注意
在为本地化路由使用PHP属性时,必须使用路径
指定路径数组的命名参数。
当匹配到本地化路由时,Symfony在整个请求过程中自动使用相同的区域ob娱乐下载设置。
提示
当应用程序使用完整的“语言+区域”区域设置时(例如:fr_FR
,fr_BE
),如果所有相关区域的url都是相同的,路由只能使用语言部分(例如:fr
),以避免重复使用相同网址。
国际化应用程序的一个常见需求是为所有路由加上区域设置前缀。这可以通过为每个语言环境定义一个不同的前缀来实现(如果你喜欢,可以为默认语言环境设置一个空前缀):
- YAML
- XML
- PHP
1 2 3 4 5 6 7
#配置/线路/ annotations.yaml控制器:资源:“. . / . . / src /控制器/”类型:注释前缀:en:”#不要为url加上英文前缀,默认的语言环境问:' /问'
另一个常见的要求是根据语言环境在不同的域上托管网站。这可以通过为每个地区定义不同的主机来实现。
- YAML
- XML
- PHP
1 2 3 4 5 6 7
#配置/线路/ annotations.yaml控制器:资源:“. . / . . / src /控制器/”类型:注释主持人:en:“https://www.example.com”问:“https://www.example.nl”
HTTP缓存.
路由可以配置无状态的
布尔选项,以声明会话不应该在匹配请求时使用:
- 属性
- YAML
- XML
- PHP
12 3 4 5 6 7 8 9 10 11 12 13 14
/ / src /控制器/ MainController.php名称空间应用程序\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\路由\注释\路线;类MainController扩展AbstractController{#[路由('/',名称:'主页',无状态:true)]公共函数主页():响应{/ /……}}
现在,如果使用了会话,应用程序将根据您的kernel.debug
参数:
启用
:将抛出一个UnexpectedSessionUsageException异常禁用
:将记录一个警告
它将帮助您理解并有望修复应用程序中的意外行为。
< a href = "…" >值手动添加到HTML模板中。另外,如果某些路由的URL发生变化,只需更新路由配置,所有链接都会更新。
要生成URL,您需要指定路由的名称(例如:blog_show
)和路由所定义的参数的值(例如:Slug = my blog-post
).
因此,每个路由都有一个内部名称,在应用程序中必须是唯一的。方法显式设置路由名的名字
选项,Symfoob娱乐下载ny会根据控制器和动作自动生成一个名称。
AbstractController,使用generateUrl ()
助手:
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 27 28 29 30 31 32
/ / src /控制器/ BlogController.php名称空间应用程序\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\路由\注释\路线;使用ob娱乐下载\组件\路由\发电机\UrlGeneratorInterface;类BlogController扩展AbstractController{#[Route('/blog', name: 'blog_list')]公共函数列表():响应{//生成不带路由参数的URL$signUpPage=$这->generateUrl (“sign_up”);//生成带有路由参数的URL$userProfilePage=$这->generateUrl (“user_profile”, (“用户名”= >$用户->getUserIdentifier ()));//生成的url默认为“绝对路径”。传递第三个可选的//参数来生成不同的URL(例如,一个“绝对URL”)$signUpPage=$这->generateUrl (“sign_up”, [], UrlGeneratorInterface::ABSOLUTE_URL);//当路由被本地化时,Symfony默认使用当前请求地区ob娱乐下载//如果你想显式地设置locale,传递一个不同的'_locale'值$signUpPageInDutch=$这->generateUrl (“sign_up”, (“_locale”= >“问”]);/ /……}}
请注意
如果你通过generateUrl ()
方法一些不属于路由定义的参数,它们会作为查询字符串包含在生成的URL中:
1 2 3
$这->generateUrl (“博客”, (“页面”= >2,“类别”= >Sob娱乐下载ymfony的]);// 'blog'路由只定义'page'参数;生成的URL为:/ / /博客/ 2 ?类别= Symfoob娱乐下载ny
谨慎
虽然对象在用作占位符时被转换为字符串,但在用作额外参数时不被转换。所以,如果你传递一个对象(例如Uuid)作为一个额外参数的值,你需要显式地将它转换为字符串:
1
$这->generateUrl (“博客”, (“uuid”= >(字符串)$实体->getUuid ()));
如果您的控制器没有从AbstractController
,你需要在控制器中获取服务并按照下一节的说明进行操作。
路由器ob娱乐下载Symfony服务变成您自己的服务并使用它生成()
方法。当使用服务自动装配只需要在服务构造函数中添加参数,并使用UrlGeneratorInterface类:
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 27 28 29 30 31 32
/ / src /服务/ SomeService.php名称空间应用程序\服务;使用ob娱乐下载\组件\路由\发电机\UrlGeneratorInterface;类SomeService{公共函数__construct(私人UrlGeneratorInterface$路由器){}公共函数someMethod(){/ /……//生成不带路由参数的URL$signUpPage=$这->路由器->生成(“sign_up”);//生成带有路由参数的URL$userProfilePage=$这->路由器->生成(“user_profile”, (“用户名”= >$用户->getUserIdentifier ()));//生成的url默认为“绝对路径”。传递第三个可选的//参数来生成不同的URL(例如,一个“绝对URL”)$signUpPage=$这->路由器->生成(“sign_up”, [], UrlGeneratorInterface::ABSOLUTE_URL);//当路由被本地化时,Symfony默认使用当前请求地区ob娱乐下载//如果你想显式地设置locale,传递一个不同的'_locale'值$signUpPageInDutch=$这->路由器->生成(“sign_up”, (“_locale”= >“问”]);}}
在页面之间创建链接在关于Symfony模板的主要文章中。ob娱乐下载
路径()而且url ()
Twig函数生成url并将它们存储在JavaScript变量中。的escape ()
过滤器需要转义任何非javascript安全的值:
1 2 3
<脚本>常量路线="{{path('blog_show', {slug: 'my-blog-post'})|逃避(js)}}”;脚本>
如果需要动态生成url,或者使用纯JavaScript代码,则此解决方案不起作用。在这些情况下,考虑使用FOSJsRoutingBundle.
在服务中生成url.唯一的区别是命令不是在HTTP上下文中执行的。因此,如果生成绝对url,就会得到http://localhost/
作为主机名,而不是您的真实主机名。
解决方案是配置default_uri
选项定义命令生成url时使用的“请求上下文”:
- YAML
- XML
- PHP
1 2 3 4 5
#配置/包/ routing.yaml框架:路由器:#……default_uri:“https://example.org/my/path/”
现在,当你在命令中生成url时,你会得到预期的结果:
12 34 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 32 33 34 35 36 37 38
/ / src /命令/ SomeCommand.php名称空间应用程序\命令;使用ob娱乐下载\组件\控制台\命令\命令;使用ob娱乐下载\组件\控制台\输入\InputInterface;使用ob娱乐下载\组件\控制台\输出\OutputInterface;使用ob娱乐下载\组件\路由\发电机\UrlGeneratorInterface;使用ob娱乐下载\组件\路由\RouterInterface;/ /……类SomeCommand扩展命令{公共函数__construct(私人RouterInterface$路由器){父::__construct ();}受保护的函数执行(InputInterface$输入, OutputInterface$输出):int{//生成不带路由参数的URL$signUpPage=$这->路由器->生成(“sign_up”);//生成带有路由参数的URL$userProfilePage=$这->路由器->生成(“user_profile”, (“用户名”= >$用户->getUserIdentifier ()));//生成的url默认为“绝对路径”。传递第三个可选的//参数来生成不同的URL(例如,一个“绝对URL”)$signUpPage=$这->路由器->生成(“sign_up”, [], UrlGeneratorInterface::ABSOLUTE_URL);//当路由被本地化时,Symfony默认使用当前请求地区ob娱乐下载//如果你想显式地设置locale,传递一个不同的'_locale'值$signUpPageInDutch=$这->路由器->生成(“sign_up”, (“_locale”= >“问”]);/ /……}}
请注意
默认情况下,为web资产生成的url使用相同的urldefault_uri
值,但可以使用asset.request_context.base_path
而且asset.request_context.secure
容器参数。
getRouteCollection ()方法,因为这会重新生成路由缓存并降低应用程序的速度。
相反,尝试生成URL并捕获RouteNotFoundException当路由不存在时抛出:
1 2 3 4 5 6 7 8 9
使用ob娱乐下载\组件\路由\异常\RouteNotFoundException;/ /……试一试{$url=$这->路由器->生成($routeName,$routeParameters);}抓(RouteNotFoundException$e){//路由没有定义…}
http默认情况下。你可以改变每个命令(通过路由器的getContext ()
方法)或全局使用这些配置参数:
- YAML
- XML
- PHP
1 2 3 4
#配置/ services.yaml参数:router.request_context.scheme:“https”asset.request_context.secure:真正的
在控制台命令之外,使用计划
选项,显式定义每条路由的方案:
- 属性
- YAML
- XML
- PHP
12 3 4 5 6 7 8 9 10 11 12 13 14 15
/ / src /控制器/ SecurityController.php名称空间应用程序\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\路由\注释\路线;类SecurityController扩展AbstractController{#(路线(“/登录”,名字:“登录”,计划:[“https”]))公共函数登录():响应{/ /……}}
对象生成的URL登录
route将始终使用HTTPS。这意味着当使用路径()
Twig函数生成URL,如果原始请求的HTTP方案与路由使用的方案不同,你可能会得到一个绝对URL而不是相对URL:
1 2 3 4 5 6
{#如果当前方案是HTTPS,生成一个相对URL: /login #}{{path('login')}}{#如果当前方案是HTTP,生成一个绝对URL来改变方案:https://example.com/login #}{{path('login')}}
对于传入请求,也实施了方案需求。如果你试图访问/登录
URL与HTTP,您将自动重定向到相同的URL,但与HTTPS方案。
如果需要强制一组路由使用HTTPS协议,可以在引入路由时定义缺省方案。下面的例子强制所有定义为注解的路由使用HTTPS:
- YAML
- XML
- PHP
1 2 3 4 5 6
#配置/线路/ annotations.yaml控制器:资源:“. . / . . / src /控制器/”类型:注释默认值:计划:(https)
请注意
Security组件提供另一种强制HTTP或HTTPS的方法通过requires_channel
设置。
blog_show
)和路由所定义的参数的值(例如:Slug = my blog-post
).的名字
选项,Symfoob娱乐下载ny会根据控制器和动作自动生成一个名称。AbstractController,使用generateUrl ()
助手:
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 27 28 29 30 31 32
/ / src /控制器/ BlogController.php名称空间应用程序\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\路由\注释\路线;使用ob娱乐下载\组件\路由\发电机\UrlGeneratorInterface;类BlogController扩展AbstractController{#[Route('/blog', name: 'blog_list')]公共函数列表():响应{//生成不带路由参数的URL$signUpPage=$这->generateUrl (“sign_up”);//生成带有路由参数的URL$userProfilePage=$这->generateUrl (“user_profile”, (“用户名”= >$用户->getUserIdentifier ()));//生成的url默认为“绝对路径”。传递第三个可选的//参数来生成不同的URL(例如,一个“绝对URL”)$signUpPage=$这->generateUrl (“sign_up”, [], UrlGeneratorInterface::ABSOLUTE_URL);//当路由被本地化时,Symfony默认使用当前请求地区ob娱乐下载//如果你想显式地设置locale,传递一个不同的'_locale'值$signUpPageInDutch=$这->generateUrl (“sign_up”, (“_locale”= >“问”]);/ /……}}
请注意
如果你通过generateUrl ()
方法一些不属于路由定义的参数,它们会作为查询字符串包含在生成的URL中:
1 2 3
$这->generateUrl (“博客”, (“页面”= >2,“类别”= >Sob娱乐下载ymfony的]);// 'blog'路由只定义'page'参数;生成的URL为:/ / /博客/ 2 ?类别= Symfoob娱乐下载ny
谨慎
虽然对象在用作占位符时被转换为字符串,但在用作额外参数时不被转换。所以,如果你传递一个对象(例如Uuid)作为一个额外参数的值,你需要显式地将它转换为字符串:
1
$这->generateUrl (“博客”, (“uuid”= >(字符串)$实体->getUuid ()));
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 27 28 29 30 31 32
/ / src /控制器/ BlogController.php名称空间应用程序\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\路由\注释\路线;使用ob娱乐下载\组件\路由\发电机\UrlGeneratorInterface;类BlogController扩展AbstractController{#[Route('/blog', name: 'blog_list')]公共函数列表():响应{//生成不带路由参数的URL$signUpPage=$这->generateUrl (“sign_up”);//生成带有路由参数的URL$userProfilePage=$这->generateUrl (“user_profile”, (“用户名”= >$用户->getUserIdentifier ()));//生成的url默认为“绝对路径”。传递第三个可选的//参数来生成不同的URL(例如,一个“绝对URL”)$signUpPage=$这->generateUrl (“sign_up”, [], UrlGeneratorInterface::ABSOLUTE_URL);//当路由被本地化时,Symfony默认使用当前请求地区ob娱乐下载//如果你想显式地设置locale,传递一个不同的'_locale'值$signUpPageInDutch=$这->generateUrl (“sign_up”, (“_locale”= >“问”]);/ /……}}
请注意
如果你通过generateUrl ()
方法一些不属于路由定义的参数,它们会作为查询字符串包含在生成的URL中:
1 2 3
$这->generateUrl (“博客”, (“页面”= >2,“类别”= >Sob娱乐下载ymfony的]);// 'blog'路由只定义'page'参数;生成的URL为:/ / /博客/ 2 ?类别= Symfoob娱乐下载ny
谨慎
虽然对象在用作占位符时被转换为字符串,但在用作额外参数时不被转换。所以,如果你传递一个对象(例如Uuid)作为一个额外参数的值,你需要显式地将它转换为字符串:
1
$这->generateUrl (“博客”, (“uuid”= >(字符串)$实体->getUuid ()));
如果您的控制器没有从AbstractController
,你需要在控制器中获取服务并按照下一节的说明进行操作。
路由器ob娱乐下载Symfony服务变成您自己的服务并使用它生成()
方法。当使用服务自动装配只需要在服务构造函数中添加参数,并使用UrlGeneratorInterface类:
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 27 28 29 30 31 32
/ / src /服务/ SomeService.php名称空间应用程序\服务;使用ob娱乐下载\组件\路由\发电机\UrlGeneratorInterface;类SomeService{公共函数__construct(私人UrlGeneratorInterface$路由器){}公共函数someMethod(){/ /……//生成不带路由参数的URL$signUpPage=$这->路由器->生成(“sign_up”);//生成带有路由参数的URL$userProfilePage=$这->路由器->生成(“user_profile”, (“用户名”= >$用户->getUserIdentifier ()));//生成的url默认为“绝对路径”。传递第三个可选的//参数来生成不同的URL(例如,一个“绝对URL”)$signUpPage=$这->路由器->生成(“sign_up”, [], UrlGeneratorInterface::ABSOLUTE_URL);//当路由被本地化时,Symfony默认使用当前请求地区ob娱乐下载//如果你想显式地设置locale,传递一个不同的'_locale'值$signUpPageInDutch=$这->路由器->生成(“sign_up”, (“_locale”= >“问”]);}}
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 27 28 29 30 31 32
/ / src /服务/ SomeService.php名称空间应用程序\服务;使用ob娱乐下载\组件\路由\发电机\UrlGeneratorInterface;类SomeService{公共函数__construct(私人UrlGeneratorInterface$路由器){}公共函数someMethod(){/ /……//生成不带路由参数的URL$signUpPage=$这->路由器->生成(“sign_up”);//生成带有路由参数的URL$userProfilePage=$这->路由器->生成(“user_profile”, (“用户名”= >$用户->getUserIdentifier ()));//生成的url默认为“绝对路径”。传递第三个可选的//参数来生成不同的URL(例如,一个“绝对URL”)$signUpPage=$这->路由器->生成(“sign_up”, [], UrlGeneratorInterface::ABSOLUTE_URL);//当路由被本地化时,Symfony默认使用当前请求地区ob娱乐下载//如果你想显式地设置locale,传递一个不同的'_locale'值$signUpPageInDutch=$这->路由器->生成(“sign_up”, (“_locale”= >“问”]);}}
在页面之间创建链接在关于Symfony模板的主要文章中。ob娱乐下载
路径()而且url ()
Twig函数生成url并将它们存储在JavaScript变量中。的escape ()
过滤器需要转义任何非javascript安全的值:
1 2 3
<脚本>常量路线="{{path('blog_show', {slug: 'my-blog-post'})|逃避(js)}}”;脚本>
如果需要动态生成url,或者使用纯JavaScript代码,则此解决方案不起作用。在这些情况下,考虑使用FOSJsRoutingBundle.
1 2 3
<脚本>常量路线="{{path('blog_show', {slug: 'my-blog-post'})|逃避(js)}}”;脚本>
在服务中生成url.唯一的区别是命令不是在HTTP上下文中执行的。因此,如果生成绝对url,就会得到http://localhost/
作为主机名,而不是您的真实主机名。
解决方案是配置default_uri
选项定义命令生成url时使用的“请求上下文”:
- YAML
- XML
- PHP
1 2 3 4 5
#配置/包/ routing.yaml框架:路由器:#……default_uri:“https://example.org/my/path/”
现在,当你在命令中生成url时,你会得到预期的结果:
12 34 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 32 33 34 35 36 37 38
/ / src /命令/ SomeCommand.php名称空间应用程序\命令;使用ob娱乐下载\组件\控制台\命令\命令;使用ob娱乐下载\组件\控制台\输入\InputInterface;使用ob娱乐下载\组件\控制台\输出\OutputInterface;使用ob娱乐下载\组件\路由\发电机\UrlGeneratorInterface;使用ob娱乐下载\组件\路由\RouterInterface;/ /……类SomeCommand扩展命令{公共函数__construct(私人RouterInterface$路由器){父::__construct ();}受保护的函数执行(InputInterface$输入, OutputInterface$输出):int{//生成不带路由参数的URL$signUpPage=$这->路由器->生成(“sign_up”);//生成带有路由参数的URL$userProfilePage=$这->路由器->生成(“user_profile”, (“用户名”= >$用户->getUserIdentifier ()));//生成的url默认为“绝对路径”。传递第三个可选的//参数来生成不同的URL(例如,一个“绝对URL”)$signUpPage=$这->路由器->生成(“sign_up”, [], UrlGeneratorInterface::ABSOLUTE_URL);//当路由被本地化时,Symfony默认使用当前请求地区ob娱乐下载//如果你想显式地设置locale,传递一个不同的'_locale'值$signUpPageInDutch=$这->路由器->生成(“sign_up”, (“_locale”= >“问”]);/ /……}}
请注意
默认情况下,为web资产生成的url使用相同的urldefault_uri
值,但可以使用asset.request_context.base_path
而且asset.request_context.secure
容器参数。
getRouteCollection ()方法,因为这会重新生成路由缓存并降低应用程序的速度。
相反,尝试生成URL并捕获RouteNotFoundException当路由不存在时抛出:
1 2 3 4 5 6 7 8 9
使用ob娱乐下载\组件\路由\异常\RouteNotFoundException;/ /……试一试{$url=$这->路由器->生成($routeName,$routeParameters);}抓(RouteNotFoundException$e){//路由没有定义…}
http默认情况下。你可以改变每个命令(通过路由器的getContext ()
方法)或全局使用这些配置参数:
- YAML
- XML
- PHP
1 2 3 4
#配置/ services.yaml参数:router.request_context.scheme:“https”asset.request_context.secure:真正的
在控制台命令之外,使用计划
选项,显式定义每条路由的方案:
- 属性
- YAML
- XML
- PHP
12 3 4 5 6 7 8 9 10 11 12 13 14 15
/ / src /控制器/ SecurityController.php名称空间应用程序\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\路由\注释\路线;类SecurityController扩展AbstractController{#(路线(“/登录”,名字:“登录”,计划:[“https”]))公共函数登录():响应{/ /……}}
对象生成的URL登录
route将始终使用HTTPS。这意味着当使用路径()
Twig函数生成URL,如果原始请求的HTTP方案与路由使用的方案不同,你可能会得到一个绝对URL而不是相对URL:
1 2 3 4 5 6
{#如果当前方案是HTTPS,生成一个相对URL: /login #}{{path('login')}}{#如果当前方案是HTTP,生成一个绝对URL来改变方案:https://example.com/login #}{{path('login')}}
对于传入请求,也实施了方案需求。如果你试图访问/登录
URL与HTTP,您将自动重定向到相同的URL,但与HTTPS方案。
如果需要强制一组路由使用HTTPS协议,可以在引入路由时定义缺省方案。下面的例子强制所有定义为注解的路由使用HTTPS:
- YAML
- XML
- PHP
1 2 3 4 5 6
#配置/线路/ annotations.yaml控制器:资源:“. . / . . / src /控制器/”类型:注释默认值:计划:(https)
请注意
Security组件提供另一种强制HTTP或HTTPS的方法通过requires_channel
设置。
- YAML
- XML
- PHP
1 2 3 4
#配置/ services.yaml参数:router.request_context.scheme:“https”asset.request_context.secure:真正的
计划
选项,显式定义每条路由的方案:- 属性
- YAML
- XML
- PHP
12 3 4 5 6 7 8 9 10 11 12 13 14 15
/ / src /控制器/ SecurityController.php名称空间应用程序\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\路由\注释\路线;类SecurityController扩展AbstractController{#(路线(“/登录”,名字:“登录”,计划:[“https”]))公共函数登录():响应{/ /……}}
登录
route将始终使用HTTPS。这意味着当使用路径()
Twig函数生成URL,如果原始请求的HTTP方案与路由使用的方案不同,你可能会得到一个绝对URL而不是相对URL:1 2 3 4 5 6
{#如果当前方案是HTTPS,生成一个相对URL: /login #}{{path('login')}}{#如果当前方案是HTTP,生成一个绝对URL来改变方案:https://example.com/login #}{{path('login')}}
/登录
URL与HTTP,您将自动重定向到相同的URL,但与HTTPS方案。- YAML
- XML
- PHP
1 2 3 4 5 6
#配置/线路/ annotations.yaml控制器:资源:“. . / . . / src /控制器/”类型:注释默认值:计划:(https)
请注意
Security组件提供另一种强制HTTP或HTTPS的方法通过requires_channel
设置。