路由组件

编辑本页

警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 2.4,现已不再维护。

本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。

路由组件

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

安装

你可以用两种不同的方式安装组件:

使用

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

这里有一个简单的例子。注意,这里假设你已经配置了自动加载器来加载Routing组件:

12 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 ');// array('controller' => 'MyController', '_route' => 'route_name')

请注意

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

您可以添加任意多的路由到RouteCollection

RouteCollection: add ()方法接受两个参数。第一个是路由的名称。第二个是路线对象,它在构造函数中需要一个URL路径和一些自定义变量数组。这个自定义变量数组可以是任何东西这对您的应用程序很重要,当路由匹配时返回。

如果找不到匹配的路由ResourceNotFoundException会被扔。

除了自定义变量数组之外,还有一个_routeKey,其中包含匹配路由的名称。

定义路由

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

  1. URL路径路由。这与传递给' RequestContext '的URL相匹配,并且可以包含命名的通配符占位符(例如。{占位符})以匹配URL中的动态部分。
  2. 默认值的数组。它包含一个任意值的数组,当请求匹配路由时将返回该数组。
  3. 需求的数组。它们将占位符值的约束定义为正则表达式。
  4. 选项数组。这些包含路由的内部设置,是最不常用的。
  5. 一个主机。这是根据请求的主机进行匹配的。看到如何根据主机匹配路由欲知详情。
  6. 一组方案。它们强制执行特定的HTTP方案(httphttps).
  7. 方法的数组。它们强制执行某个HTTP请求方法(得到帖子,……)。

2.2

在Symfony 2.2中引入了主机匹配支持欧宝娱乐app下载地址

下面的方法结合了以上几种方法:

12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22
路线路线(“/归档/{月}”/ /路径数组“控制器”= >“showArchive”),//默认值数组“月”= >“[0 - 9]{4}[0 - 9]{2}”“子域名”= >“www |米”),/ /要求数组(),/ /选项“.example.com{子域名}”/ /主机数组(),/ /计划数组()/ /方法);/ /……参数匹配器->匹配(/归档/ 2012 - 01年的);/ /数组(// 'controller' => 'showArchive',// 'month' => '2012-01',// 'subdomain' => 'www',// '_route' =>…/ /)参数匹配器->匹配(“/归档/ foo”);//抛出ResourceNotFoundException

在此例中,匹配的路由为/归档/ 2012 - 01,因为{月}Wildcard匹配给定的正则表达式通配符。然而,/归档/ foo匹配,因为“foo”不符合月份通配符。

提示

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

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

使用前缀

的路由或其他实例RouteCollection另一个收集。这样你就可以建立一个路线树。属性提供的方法为子树的所有路由定义参数、要求、选项、方案和主机的前缀和默认值RouteCollection类:

12 3 4 5 6 7 8 9 10 11 12 13 14
rootCollectionRouteCollection ();subCollectionRouteCollection ();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
公共函数__constructbaseUrl方法“得到”宿主“localhost”计划“http”httpPort80httpsPort443路径' / '变量的名称

方法中的值通常可以传入$ _SERVER变量来填充RequestContext.但是如果你用HttpFoundation组件,您可以使用它请求类向RequestContext在一个快捷方式:

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

生成URL

UrlMatcher尝试找到一个适合给定请求的路由,你也可以从一个特定的路由建立一个URL:

12 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”数组“鼻涕虫”= >“我的博客帖子”));/ / /显示/我的博客帖子

请注意

如果您已经定义了一个方案,如果当前的方案是一个绝对URLRequestContext不符合要求。

从文件中加载路由

您已经看到了如何在PHP中轻松地向集合添加路由。但是你也可以从许多不同的文件中加载路由。

Routing组件附带了许多加载器类,每个类都使您能够从某种格式的外部文件加载路由定义的集合。每个加载器都期望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//查看*this*目录定位器FileLocator (数组__DIR__));加载程序YamlFileLoader (定位器);集合加载程序->负载(“routes.yml”);

除了YamlFileLoader还有另外两个加载器的工作方式相同:

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

12 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 ();集合加载程序->负载(关闭);

作为注解的路由

最后但并非最不重要的是AnnotationDirectoryLoader而且AnnotationFileLoader从类注释加载路由定义。这里省略了具体的细节。

一体化路由器

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

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__));requestContextRequestContext (_SERVER“REQUEST_URI”]);路由器路由器(YamlFileLoader (定位器),“routes.yml”数组“cache_dir”= >__DIR__/缓存的),requestContext);路由器->匹配(“/ foo / bar”);

请注意

如果使用缓存,Routing组件将编译保存在cache_dir.这意味着您的脚本必须具有该位置的写权限。

此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。