路由组件
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.8,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.3(当前的稳定版本)。
路由组件
路由组件将HTTP请求映射到一组配置变量。
安装
1
美元作曲家需要symfony /路由ob娱乐下载
或者,您可以克隆的https://github.com/ob娱乐下载symfony/routing存储库。
请注意
如果你安装这个组件之外的Symfony应用程序,你必须要求ob娱乐下载供应商/ autoload.php
文件在你的代码,使作曲家提供的类加载机制。读这篇文章为更多的细节。
使用
另请参阅
这篇文章解释了如何使用路由功能作为一个独立的组件在任何PHP应用程序。读了路由文章在Symfony应用程序了解如何使用它。ob娱乐下载
为了建立一个基本的路由系统需要三个部分:
- 一个RouteCollection,其中包含路由定义类的实例路线)
- 一个RequestContext请求的信息
- 一个UrlMatcher,执行请求的映射到一个路线
这是一个简单的例子。注意,这个假设您已经配置了自动装卸机加载路由组件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
使用ob娱乐下载\组件\路由\匹配器\UrlMatcher;使用ob娱乐下载\组件\路由\RequestContext;使用ob娱乐下载\组件\路由\RouteCollection;使用ob娱乐下载\组件\路由\路线;美元路线=新路线(' / foo ',数组(“_controller”= >“MyController”));美元路线=新RouteCollection ();美元路线- >add (“route_name”,美元路线);美元上下文=新RequestContext (' / ');美元匹配器=新UrlMatcher (美元路线,美元上下文);美元参数=美元匹配器- >匹配(' / foo ');/ /数组(“_controller”= >“MyController”,“_route”= >“route_name”)
请注意
的RequestContext参数可以填充中存储的值$ _SERVER
,但它是更容易使用HttpFoundation组件作为解释道下面。
你可以添加尽可能多的路线RouteCollection。
的RouteCollection: add ()方法有两个参数。第一个是路线的名称。第二个是一个路线对象,它将URL路径和一些自定义的变量在其构造函数的数组。这种阵列的自定义变量任何东西这是重要的应用程序,当路由匹配返回。
的UrlMatcher::匹配()返回变量的设置以及通配符的路由上占位符(见下文)。您的应用程序现在可以使用此信息来继续处理请求。除了配置变量_route
关键是补充说,该公司持有的名称匹配。
如果没有匹配的路由可以找到,ResourceNotFoundException将抛出。
定义路由
一个完整的路由定义可以包含七个部分:
- URL路径的路线。这是匹配的URL传递给“RequestContext”,并且可以包含通配符占位符(如命名。
{占位符}
在URL)来匹配动态部分。 - 默认值的数组。这将返回包含任意的值的数组,当请求匹配的路线。
- 一个数组的需求。这些定义的约束值占位符的正则表达式。
- 一个选项数组。这些包含内部设置路线和最常需要的。
- 一个主机。这是匹配请求的主机。看到如何匹配基于主机的路由为更多的细节。
- 一个数组的计划。这些执行特定的HTTP方案(
http
,https
)。 - 一个数组的方法。这些执行特定的HTTP请求方法(
头
,得到
,帖子
,……)。
采取以下路线,将其中的几个想法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
美元路线=新路线(“/归档/{月}”,/ /路径数组(“_controller”= >“showArchive”),/ /默认值数组(“月”= >“[0 - 9]{4}[0 - 9]{2}”,“子域名”= >“www |米”),/ /要求数组(),/ /选项“.example.com{子域名}”,/ /主机数组(),/ /计划数组()/ /方法);/ /……美元参数=美元匹配器- >匹配(/归档/ 2012 - 01年的);/ /数组(/ /“_controller”= >“showArchive”,/ / '月' = > ' 2012 - 01年',/ /“子域名”= >“www”,/ / ' _route ' = >……/ /)美元参数=美元匹配器- >匹配(“/归档/ foo”);/ /抛出ResourceNotFoundException
在这种情况下,路线相匹配/归档/ 2012 - 01
,因为{月}
通配符匹配给定的正则表达式通配符。然而,/归档/ foo
做不匹配,因为“foo”失败的通配符。
使用通配符时,当调用这些数组中返回结果匹配
。通配符匹配的路径的一部分(例如2012 - 01
)作为值。
提示
如果你想匹配的所有url开始与一个特定的路径和结束在一个任意后缀可以使用路由定义如下:
1 2 3 4 5
美元路线=新路线(' /启动/{后缀}',数组(“后缀”= >”),数组(“后缀”= >”。*’));
使用前缀
您可以添加路线或其他的实例RouteCollection来另一个收集。这样就可以建立一个树的路线。另外您可以定义一个前缀和默认值的参数要求,选择,方案和主机的所有航线使用方法提供的子树RouteCollection
类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
美元rootCollection=新RouteCollection ();美元subCollection=新RouteCollection ();美元subCollection- >添加(…);美元subCollection- >添加(…);美元subCollection- >addPrefix (/前缀的);美元subCollection- >addDefaults (数组(…));美元subCollection- >addRequirements (数组(…));美元subCollection- >使用addoption (数组(…));美元subCollection- >setHost (“admin.example.com”);美元subCollection- >setMethods (数组(“职位”));美元subCollection- >setSchemes (数组(“https”));美元rootCollection- >addCollection (美元subCollection);
设置请求参数
的RequestContext提供关于当前请求的信息。您可以定义一个HTTP请求的所有参数与这类通过其构造函数:
1 2 3 4 5 6 7 8 9 10
公共函数__construct(美元baseUrl=”,美元方法=“得到”,美元主机=“localhost”,美元计划=“http”,美元httpPort=80年,美元httpsPort=443年,美元路径=' / ',美元变量的名称=”)
通常你可以通过值$ _SERVER
变量来填充RequestContext。但是如果你使用HttpFoundation组件,您可以使用它请求类来喂RequestContext快捷方式:
1 2 3 4
使用ob娱乐下载\组件\HttpFoundation\请求;美元上下文=新RequestContext ();美元上下文- >fromRequest(请求::createFromGlobals ());
生成一个URL
而UrlMatcher试图找到一个适合的路线给定的URL请求你还可以建立一个从一个特定的路线:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
使用ob娱乐下载\组件\路由\发电机\UrlGenerator;使用ob娱乐下载\组件\路由\RequestContext;使用ob娱乐下载\组件\路由\路线;使用ob娱乐下载\组件\路由\RouteCollection;美元路线=新RouteCollection ();美元路线- >add (“show_post”,新路线(' /显示/{蛞蝓}'));美元上下文=新RequestContext (' / ');美元发电机=新UrlGenerator (美元路线,美元上下文);美元url=美元发电机- >生成(“show_post”,数组(“鼻涕虫”= >“我的博客帖子”));/ / /显示/我的博客帖子
请注意
如果您定义了一个计划,一个绝对URL生成如果当前的计划RequestContext不匹配的要求。
检查是否存在一个路线
在高度动态的应用程序中,可能需要在使用前检查是否存在一个路径来生成一个URL。在这些情况下,不要使用getRouteCollection ()方法,因为恢复路由缓存和减慢应用程序。
相反,尝试生成URL和捕获RouteNotFoundException时抛出的路线不存在:
1 2 3 4 5 6 7 8 9
使用ob娱乐下载\组件\路由\异常\RouteNotFoundException;/ /……试一试{美元url=美元发电机- >生成(美元dynamicRouteName,美元参数);}抓(RouteNotFoundException美元e){/ /定义的路线不是……}
从文件中加载路径
您已经看到了如何轻松地添加路线集合在PHP。但是你也可以从许多不同的加载路径文件。
路由组件有一个类装入器的数量,每个给你的能力从一个外部文件加载路径的集合定义的格式。每个加载程序预计FileLocator实例构造函数参数。您可以使用FileLocator定义一个数组的路径加载程序将寻找所请求的文件。如果找到该文件,加载程序返回RouteCollection。
如果你使用YamlFileLoader
,然后路线的定义是这样的:
1 2 3 4 5 6 7 8
# routes.ymlroute1:路径:/ foo默认值:{_controller:“MyController:: fooAction”}route2:路径:/ foo / bar默认值:{_controller:“MyController:: foobarAction”}
加载这个文件,您可以使用下面的代码。这假设你routes.yml
文件在同一目录如下的代码:
1 2 3 4 5 6 7
使用ob娱乐下载\组件\配置\FileLocator;使用ob娱乐下载\组件\路由\加载程序\YamlFileLoader;/ /是这里面* *目录中美元fileLocator=新FileLocator (数组(__DIR__));美元加载程序=新YamlFileLoader (美元fileLocator);美元路线=美元加载程序- >负载(“routes.yml”);
除了YamlFileLoader有两个其他装载机工作相同的方式:
如果你使用PhpFileLoader你必须提供一个PHP文件的名称返回一个RouteCollection:
1 2 3 4 5 6 7 8 9 10 11 12
/ / RouteProvider.php使用ob娱乐下载\组件\路由\RouteCollection;使用ob娱乐下载\组件\路由\路线;美元路线=新RouteCollection ();美元路线- >add (“route_name”,新路线(' / foo ',数组(“_controller”= >“ExampleController”)));/ /……返回美元路线;
路线是闭包
还有一ClosureLoader,它调用闭包和使用结果RouteCollection:
1 2 3 4 5 6 7 8
使用ob娱乐下载\组件\路由\加载程序\ClosureLoader;美元关闭=函数(){返回新RouteCollection ();};美元加载程序=新ClosureLoader ();美元路线=美元加载程序- >负载(美元关闭);
路线是注释
最后但并非最不重要的AnnotationDirectoryLoader和AnnotationFileLoader从类加载路径定义注释。具体细节是离开这里。
请注意
为了使用注释装载机,你应该安装了教义/注释
和教义/缓存
包与作曲家。
提示
注释的类不自动加载,所以你必须使用类加载器加载它们是这样的:
1 2 3 4 5 6 7 8 9
使用作曲家\自动装载\类加载器;使用学说\常见的\注释\AnnotationRegistry;/ * *@var类加载器加载程序* /美元美元加载程序=需要__DIR__。“/ . . /供应商/ autoload.php”;AnnotationRegistry::registerLoader ([美元加载程序,“loadClass”]);返回美元加载程序;
一体化的路由器
的路由器类是一个一体化的包快速使用路由组件。构造函数预期加载程序实例,主要路径路由定义和其他一些设置:
1 2 3 4 5 6 7
公共函数__construct(LoaderInterface美元加载程序,美元资源数组,美元选项=数组(),RequestContext美元上下文= null, LoggerInterface美元日志记录器= null);
与cache_dir
选择您可以启用路由缓存(如果你提供一个路径)或禁用缓存(如果它的设置零
)。缓存是在后台自动完成,如果你想使用它。一个基本的例子路由器类的样子:
1 2 3 4 5 6 7 8 9 10
美元fileLocator=新FileLocator (数组(__DIR__));美元requestContext=新RequestContext (' / ');美元路由器=新路由器(新YamlFileLoader (美元fileLocator),“routes.yml”,数组(“cache_dir”= >__DIR__。/缓存的),美元requestContext);美元路由器- >匹配(“/ foo / bar”);
请注意
如果你使用缓存,路由组件将保存在编译新类cache_dir
。这意味着您的脚本必须有写权限的位置。
了解更多
- 路由
- 如何通过条件限制路由匹配
- 如何创建一个定制的路线装载机
- 如何可视化和调试路线
- 如何包含外部路由资源
- 如何通过额外的信息从一个控制器的路线吗
- 如何在JavaScript生成url路由
- 如何匹配基于主机的路由
- 如何定义可选的占位符
- 没有自定义控制器如何配置一个重定向
- 使用斜杠重定向url
- 如何定义路由需求
- 从数据库查找路线:Symfony CMF dynamicrouteob娱乐下载
- 如何迫使路线总是使用HTTPS或HTTP吗
- 如何使用服务容器参数在你的路线吗
- 如何让一个“/”字符在一个路由参数
- 控制器
- 如何在一个控制器手动验证CSRF牌吗
- 如何自定义错误页面吗
- 如何将请求转发到另一个控制器吗
- 如何定义控制器作为服务吗
- 如何创建一个SOAP Web服务在Symfony控制器ob娱乐下载
- 如何上传文件
- 如何使用Apache路由器吗