路由组件

编辑该页面

警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 2.0,不再维护。

这个页面的更新版本Symf欧宝娱乐app下载地址ony 6.2(当前的稳定版本)。

路由组件

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

安装

你可以在许多不同的方式:安装组件

使用

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

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

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
使用欧宝娱乐app下载地址\组件\路由\匹配器\UrlMatcher;使用欧宝娱乐app下载地址\组件\路由\RequestContext;使用欧宝娱乐app下载地址\组件\路由\RouteCollection;使用欧宝娱乐app下载地址\组件\路由\路线;美元路线=路线(' / foo ',数组(“控制器”= >“MyController”));美元路线=RouteCollection ();美元路线- >add (“route_name”,美元路线);美元上下文=RequestContext (美元_SERVER(“REQUEST_URI”]);美元匹配器=UrlMatcher (美元路线,美元上下文);美元参数=美元匹配器- >匹配(' / foo ');/ /数组(“控制器”= >“MyController”,“_route”= >“route_name”)

请注意

使用时要小心$ _SERVER (“REQUEST_URI”),因为它可能包括任何查询参数的URL,这将导致路由匹配的问题。一个简单的方法来解决这个问题是使用HttpFoundation组件作为解释道下面

你可以添加尽可能多的路线RouteCollection

RouteCollection: add ()方法有两个参数。第一个是路线的名称。第二个是一个路线对象,它将URL路径和一些自定义的变量在其构造函数的数组。这种阵列的自定义变量任何东西这是重要的应用程序,当路由匹配返回。

如果没有匹配的路线可以找到ResourceNotFoundException将抛出。

除了你的自定义变量,数组_route关键是补充说,该公司持有的名称匹配。

定义路由

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

1。URL模式的路线。这是匹配的URL传递给“RequestContext”,并且可以包含通配符占位符(如命名。{占位符}在URL)来匹配动态部分。

2。默认值的数组。这将返回包含任意的值的数组,当请求匹配的路线。

3所示。一个数组的需求。这些定义的约束值占位符的正则表达式。

4所示。一个选项数组。这些包含内部设置路线和最常需要的。

采取以下路线,将其中的几个想法:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
美元路线=路线(“/归档/{月}”,/ /路径数组(“控制器”= >“showArchive”),/ /默认值数组(“月”= >“[0 - 9]{4}[0 - 9]{2}”),/ /要求数组()/ /选项);/ /……美元参数=美元匹配器- >匹配(/归档/ 2012 - 01年的);/ /数组(/ /“控制器”= >“showArchive”,/ / '月' = > ' 2012 - 01年',/ / ' _route ' = >……/ /)美元参数=美元匹配器- >匹配(“/归档/ foo”);/ /抛出ResourceNotFoundException

在这种情况下,路线相匹配/归档/ 2012 - 01,因为{月}通配符匹配给定的正则表达式通配符。然而,/归档/ foo匹配,因为“foo”失败的通配符。

除了正则表达式约束有两种特殊要求可以定义:

  • _method执行一个特定的HTTP请求方法(,得到,帖子,……)
  • _scheme执行一个特定的HTTP方案(http,https)

例如,以下只会接受请求路由到/ foo POST方法和安全连接:

1 2 3 4 5
美元路线=路线(' / foo ',数组(),数组(“_method”= >“职位”,“_scheme”= >“https”));

提示

如果你想匹配的所有url开始与一个特定的路径和结束在一个任意后缀可以使用路由定义如下:

1 2 3 4 5
美元路线=路线(' /启动/{后缀}',数组(“后缀”= >),数组(“后缀”= >”。*’));

使用前缀

您可以添加路线或其他的实例RouteCollection另一个收集。这样就可以建立一个树的路线。另外您可以定义一个前缀,默认的需求和默认选项对所有子树的路线:

1 2 3 4 5 6 7 8 9 10 11
美元rootCollection=RouteCollection ();美元subCollection=RouteCollection ();美元subCollection- >添加(…);美元subCollection- >添加(…);美元rootCollection- >addCollection (美元subCollection,/前缀的,数组(“_scheme”= >“https”));

设置请求参数

RequestContext提供关于当前请求的信息。您可以定义一个HTTP请求的所有参数与这类通过其构造函数:

1 2 3 4 5 6 7 8
公共函数__construct(美元baseUrl=,美元方法=“得到”,美元主机=“localhost”,美元计划=“http”,美元httpPort=80年,美元httpsPort=443年)

通常你可以通过值$ _SERVER变量来填充RequestContext。但是如果你使用HttpFoundation组件,您可以使用它请求类来喂RequestContext快捷方式:

1 2 3 4
使用欧宝娱乐app下载地址\组件\HttpFoundation\请求;美元上下文=RequestContext ();美元上下文- >fromRequest(请求::createFromGlobals ());

生成一个URL

UrlMatcher试图找到一个适合的路线给定的URL请求你还可以建立一个从一个特定的路线:

1 2 3 4 5 6 7 8 9 10 11 12 13
使用欧宝娱乐app下载地址\组件\路由\发电机\UrlGenerator;美元路线=RouteCollection ();美元路线- >add (“show_post”,路线(' /显示/{蛞蝓}'));美元上下文=RequestContext (美元_SERVER(“REQUEST_URI”]);美元发电机=UrlGenerator (美元路线,美元上下文);美元url=美元发电机- >生成(“show_post”,数组(“鼻涕虫”= >“我的博客帖子”));/ / /显示/我的博客帖子

请注意

如果您已经定义了_scheme要求,绝对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
使用欧宝娱乐app下载地址\组件\配置\FileLocator;使用欧宝娱乐app下载地址\组件\路由\加载程序\YamlFileLoader;/ /看里面* *目录中美元定位器=FileLocator (数组(__DIR__));美元加载程序=YamlFileLoader (美元定位器);美元集合=美元加载程序- >负载(“routes.yml”);

除了YamlFileLoader有两个其他装载机工作相同的方式:

如果你使用PhpFileLoader你必须提供一个php文件的名称返回一个RouteCollection:

1 2 3 4 5 6 7 8 9 10 11 12
/ / RouteProvider.php使用欧宝娱乐app下载地址\组件\路由\RouteCollection;使用欧宝娱乐app下载地址\组件\路由\路线;美元集合=RouteCollection ();美元集合- >add (“route_name”,路线(' / foo ',数组(“控制器”= >“ExampleController”)));/ /……返回美元集合;

路线是闭包

还有一ClosureLoader,它调用闭包和使用结果RouteCollection:

1 2 3 4 5 6 7 8
使用欧宝娱乐app下载地址\组件\路由\加载程序\ClosureLoader;美元关闭=函数(){返回RouteCollection ();};美元加载程序=ClosureLoader ();美元集合=美元加载程序- >负载(美元关闭);

路线是注释

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

一体化的路由器

路由器类是一个一体化的包快速使用路由组件。构造函数预期加载程序实例,主要路径路由定义和其他一些设置:

1 2 3 4 5 6 7
公共函数__construct(LoaderInterface美元加载程序,美元资源数组,美元选项=数组(),RequestContext美元上下文= null,数组美元违约=数组());

cache_dir选择您可以启用路由缓存(如果你提供一个路径)或禁用缓存(如果它的设置)。缓存是在后台自动完成,如果你想使用它。一个基本的例子路由器类的样子:

1 2 3 4 5 6 7 8 9 10
美元定位器=FileLocator (数组(__DIR__));美元requestContext=RequestContext (美元_SERVER(“REQUEST_URI”]);美元路由器=路由器(YamlFileLoader (美元定位器),“routes.yml”,数组(“cache_dir”= >__DIR__/缓存的),美元requestContext);美元路由器- >匹配(“/ foo / bar”);

请注意

如果你使用缓存,路由组件将保存在编译新类cache_dir。这意味着您的脚本必须有写权限的位置。

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