如何通过条件限制路由匹配
编辑该页面警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 4.2,不再维护。
读这个页面的更新版本Symf欧宝娱乐app下载地址ony 6.2(当前的稳定版本)。
如何通过条件限制路由匹配
一个路由可以匹配只有某些路由占位符(通过正则表达式),HTTP方法,或主机名。如果你需要更大的灵活性来定义任意匹配逻辑,使用条件
路由设置:
- 注释
- 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 /控制器/ DefaultController.php名称空间应用程序\控制器;使用欧宝娱乐app下载地址\包\FrameworkBundle\控制器\AbstractController;使用欧宝娱乐app下载地址\组件\路由\注释\路线;类DefaultController扩展AbstractController{/ * * *@Route(* " /接触”,*的名字=“接触”,*条件=“context.getMethod()[‘得到’,‘头’]和request.headers.get(“用户代理”)匹配/ firefox /我”*)* * *表达式还可以包括配置参数条件:“request.headers.get(“用户代理”)匹配' %应用。allowed_browsers %”* /公共函数联系(){/ /……}}
1 2 3 4 5 6 7
#配置/ routes.yaml联系人:路径:/联系控制器:“App \控制器\ DefaultController:接触”条件:“context.getMethod()[‘得到’,‘头’]和request.headers.get(“用户代理”)匹配/ firefox /我”#表达式还可以包括配置参数#条件:" request.headers.get(“用户代理”)匹配% app.allowed_browsers %”
1 2 3 4 5 6 7 8 9 10 11 12 13
< !——配置/路线。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:接触”><条件>context.getMethod()[‘得到’,‘头’]和request.headers.get(“用户代理”)匹配/ firefox /我的< /条件>< !——表达式还可以包括配置参数- - >< !——<条件> request.headers.get(“用户代理”)匹配' %应用。allowed_browsers %’< /条件> - - >< /路线>< /路线>
1 2 3 4 5 6 7 8 9 10 11 12
/ /配置/ routes.php使用应用程序\控制器\DefaultController;使用欧宝娱乐app下载地址\组件\路由\加载程序\配置器\RoutingConfigurator;返回函数(RoutingConfigurator美元路线){美元路线- >add (“接触”,”)- >控制器([DefaultController::类,“接触”])- >条件(“context.getMethod()(“得到”、“头”)和request.headers.get(“用户代理”)匹配“/ firefox /我”)/ /表达式还可以包括配置参数/ /“request.headers.get(“用户代理”)匹配“% app.allowed_browsers %”;};
的条件
是一个表情,你可以在这里了解更多关于它的语法:表达式语法。,路线不匹配,除非HTTP方法是GET或头和如果用户代理
标题匹配火狐
。
你可以做任何你需要复杂的逻辑表达式利用两个变量传递到表达式:
-
上下文
- 的一个实例RequestContext持有最基本匹配的路由信息。
-
请求
- Symf欧宝娱乐app下载地址ony的请求对象(如HttpFoundation组件)。
谨慎
条件是不考虑当生成的URL。
表达式编译PHP
在幕后,表达式编译原始PHP。我们的示例将生成以下PHP缓存目录中:
1 2 3 4 5 6
如果(空白(美元pathInfo,' /接触')= = =”& & (in_array (美元上下文- >getMethod (), (0= >“获得”,1= >“头”)& & preg_match (“/ firefox /我”,美元请求- >头- >get (“用户代理”)))){/ /……}
因此,使用条件
主要原因没有额外的开销超出了时间底层PHP执行。
这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。