路由组件

编辑该页面

警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.7,不再维护。

这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。

路由组件

路由组件将HTTP请求映射到一组配置变量。

安装

1
美元作曲家需要symfony /路由ob娱乐下载

或者,您可以克隆的https://github.com/ob娱乐下载symfony/routing存储库。

请注意

如果你安装这个组件之外的Symfony应用程序,你必须要求ob娱乐下载供应商/ autoload.php文件在你的代码,使作曲家提供的类加载机制。读这篇文章为更多的细节。

使用

为了建立一个基本的路由系统需要三个部分:

这是一个简单的例子。注意,这个假设您已经配置了自动装卸机加载路由组件:

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将抛出。

定义路由

一个完整的路由定义可以包含七个部分:

  1. URL路径的路线。这是匹配的URL传递给“RequestContext”,并且可以包含通配符占位符(如命名。{占位符}在URL)来匹配动态部分。
  2. 默认值的数组。这将返回包含任意的值的数组,当请求匹配的路线。
  3. 一个数组的需求。这些定义的约束值占位符的正则表达式。
  4. 一个选项数组。这些包含内部设置路线和最常需要的。
  5. 一个主机。这是匹配请求的主机。看到如何匹配基于主机的路由为更多的细节。
  6. 一个数组的计划。这些执行特定的HTTP方案(http,https)。
  7. 一个数组的方法。这些执行特定的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不匹配的要求。

从文件中加载路径

您已经看到了如何轻松地添加路线集合在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 ();美元路线=美元加载程序- >负载(美元关闭);

路线是注释

最后但并非最不重要的AnnotationDirectoryLoaderAnnotationFileLoader从类加载路径定义注释。具体细节是离开这里。

请注意

为了使用注释装载机,你应该安装了教义/注释教义/缓存包与作曲家。

提示

注释的类不自动加载,所以你必须使用类加载器加载它们是这样的:

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。这意味着您的脚本必须有写权限的位置。

这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。