路由组件
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 4.3,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.3(当前的稳定版本)。
路由组件
路由组件将HTTP请求映射到一组配置变量。它是用于构建web应用程序,其中每个URL路由系统与一些代码来执行。
安装
1
美元作曲家需要symfony /路由ob娱乐下载
请注意
如果你安装这个组件之外的Symfony应用程序,你必须要求ob娱乐下载供应商/ autoload.php
文件在你的代码,使作曲家提供的类加载机制。读这篇文章为更多的细节。
使用
主要的ob娱乐下载Symfony的路由文章解释了该组件的所有功能使用时在一个Symfony应用程序。ob娱乐下载本文只解释了你需要做的事情在non-Symfony PHP应用程序中使用它。ob娱乐下载
路由系统设置
路由系统有三个部分:
- 一个RouteCollection,其中包含的路线定义(实例路线类);
- 一个RequestContext,请求信息;
- 一个UrlMatcher,执行路径的映射到一个路线。
这是一个快速的例子:
1 2 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
使用应用程序\控制器\BlogController;使用ob娱乐下载\组件\路由\发电机\UrlGenerator;使用ob娱乐下载\组件\路由\匹配器\UrlMatcher;使用ob娱乐下载\组件\路由\RequestContext;使用ob娱乐下载\组件\路由\路线;使用ob娱乐下载\组件\路由\RouteCollection;美元路线=新路线(“/博客/{蛞蝓}”,(“_controller”= > BlogController::类);美元路线=新RouteCollection ();美元路线- >add (“blog_show”,美元路线);美元上下文=新RequestContext (' / ');/ /路由可以匹配路线传入的请求美元匹配器=新UrlMatcher (美元路线,美元上下文);美元参数=美元匹配器- >匹配(“/博客/ lorem ipsum”);/ /参数=[美元/ /“_controller”= >“App \控制器\ BlogController”,/ /“鼻涕虫”= >“回车键”,/ /“_route”= >“blog_show”/ /)/ /路由也可以为一个给定的路线生成url美元发电机=新UrlGenerator (美元路线,美元上下文);美元url=美元发电机- >生成(“blog_show”,(“鼻涕虫”= >“我的博客帖子”]);/ / $ url = /博客/我的博客帖子的
的RouteCollection: add ()方法有两个参数。第一个是路线的名称。第二个是一个路线对象,它将URL路径和一些自定义的变量在其构造函数的数组。这种阵列的自定义变量任何东西这是重要的应用程序,当路由匹配返回。
的UrlMatcher::匹配()返回变量的设置以及路由的路由上的参数。您的应用程序现在可以使用此信息来继续处理请求。除了配置变量_route
关键是补充说,该公司持有的名称匹配。
如果没有匹配的路由可以找到,ResourceNotFoundException将抛出。
定义路由
一个完整的路由定义可以包含多达八个部分:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日
美元路线=新路线(“/归档/{月}”,/ /路径(“_controller”= >“showArchive”),/ /默认值(“月”= >“[0 - 9]{4}[0 - 9]{2}”,“子域名”= >“www |米”),/ /要求[],/ /选项“.example.com{子域名}”,/ /主机[],/ /计划[],/ /方法“context.getHost()“/匹配(安全|管理).example.com/”/ /条件);/ /……美元参数=美元匹配器- >匹配(/归档/ 2012 - 01年的);/ / (/ /“_controller”= >“showArchive”,/ / '月' = > ' 2012 - 01年',/ /“子域名”= >“www”,/ / ' _route ' = >……/ /)美元参数=美元匹配器- >匹配(“/归档/ foo”);/ /抛出ResourceNotFoundException
路线集合
您可以添加路线或其他的实例RouteCollection来另一个收集。这样就可以建立一个树的路线。另外您可以定义常见的子树的所有路线选择提供的使用方法RouteCollection
类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
美元rootCollection=新RouteCollection ();美元subCollection=新RouteCollection ();美元subCollection- >添加(…);美元subCollection- >添加(…);美元subCollection- >addPrefix (/前缀的);美元subCollection- >addDefaults ([…]);美元subCollection- >addRequirements ([…]);美元subCollection- >使用addoption ([…]);美元subCollection- >setHost (“.example.com{子域名}”);美元subCollection- >setMethods ([“职位”]);美元subCollection- >setSchemes ([“https”]);美元subCollection- >setCondition (“context.getHost()“/匹配(安全|管理).example.com/”);美元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 ());
加载路径
路由组件有一个类装入器的数量,每个给你的能力负荷路线定义从外部资源的集合。
文件路径加载器
每个加载程序预计FileLocator实例构造函数参数。您可以使用FileLocator定义一个数组的路径加载程序将寻找所请求的文件。如果找到该文件,加载程序返回RouteCollection。
如果你使用YamlFileLoader
,然后路线的定义是这样的:
1 2 3 4 5 6 7 8 9
# routes.yamlroute1:路径:/ foo控制器:MyController: fooAction方法:得到|头route2:路径:/ foo / bar控制器:FooBarInvokableController方法:把
加载这个文件,您可以使用下面的代码。这假设你routes.yaml
文件在同一目录如下的代码:
1 2 3 4 5 6 7
使用ob娱乐下载\组件\配置\FileLocator;使用ob娱乐下载\组件\路由\加载程序\YamlFileLoader;/ /是这里面* *目录中美元fileLocator=新FileLocator ([__DIR__]);美元加载程序=新YamlFileLoader (美元fileLocator);美元路线=美元加载程序- >负载(“routes.yaml”);
除了YamlFileLoader有两个其他装载机工作相同的方式:
如果你使用PhpFileLoader你必须提供一个PHP文件的名称返回一个可调用的处理RoutingConfigurator。这类允许进口链条,集合或简单的路由定义调用:
1 2 3 4 5 6 7 8 9
/ / RouteProvider.php使用ob娱乐下载\组件\路由\加载程序\配置器\RoutingConfigurator;返回函数(RoutingConfigurator美元路线){美元路线- >add (“route_name”,' / foo ')- >控制器(“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 10 11 12 13 14
使用学说\常见的\注释\AnnotationReader;使用ob娱乐下载\包\FrameworkBundle\路由\AnnotatedRouteControllerLoader;使用ob娱乐下载\组件\配置\FileLocator;使用ob娱乐下载\组件\路由\加载程序\AnnotationDirectoryLoader;美元加载程序=新AnnotationDirectoryLoader (新FileLocator (__DIR__。“/ app / controllers /”),新AnnotatedRouteControllerLoader (新AnnotationReader ()));美元路线=美元加载程序- >负载(__DIR__。“/ app / controllers /”);/ /……
请注意
为了使用注释装载机,你应该安装了教义/注释
和教义/缓存
包与作曲家。
提示
注释的类不自动加载,所以你必须使用类加载器加载它们是这样的:
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 11
美元fileLocator=新FileLocator ([__DIR__]);美元requestContext=新RequestContext (' / ');美元路由器=新路由器(新YamlFileLoader (美元fileLocator),“routes.yaml”,(“cache_dir”= >__DIR__。/缓存的),美元requestContext);美元参数=美元路由器- >匹配(“/ foo / bar”);美元url=美元路由器- >生成(“some_route”,(“参数”= >“价值”]);
请注意
如果你使用缓存,路由组件将保存在编译新类cache_dir
。这意味着您的脚本必须有写权限的位置。