路由组件
编辑本页警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 2.4,现已不再维护。
读本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。
路由组件
路由组件将HTTP请求映射到一组配置变量。
安装
你可以用两种不同的方式安装组件:
- 通过Composer安装(
欧宝娱乐app下载地址symfony /路由
在Packagist); - 使用官方Git存储库(https://github.com/欧宝娱乐app下载地址symfony/Routing).
使用
为了建立一个基本的路由系统,你需要三个部分:
- 一个RouteCollection,其中包含路由定义(类的实例)路线)
- 一个RequestContext,其中包含有关请求的信息
- 一个UrlMatcher,它执行请求到单个路由的映射
这里有一个简单的例子。注意,这里假设你已经配置了自动加载器来加载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会被扔。
除了自定义变量数组之外,还有一个_route
Key,其中包含匹配路由的名称。
定义路由
一个完整的路由定义最多可以包含七个部分:
- URL路径路由。这与传递给' RequestContext '的URL相匹配,并且可以包含命名的通配符占位符(例如。
{占位符}
)以匹配URL中的动态部分。 - 默认值的数组。它包含一个任意值的数组,当请求匹配路由时将返回该数组。
- 需求的数组。它们将占位符值的约束定义为正则表达式。
- 选项数组。这些包含路由的内部设置,是最不常用的。
- 一个主机。这是根据请求的主机进行匹配的。看到如何根据主机匹配路由欲知详情。
- 一组方案。它们强制执行特定的HTTP方案(
http
,https
). - 方法的数组。它们强制执行某个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
$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
使用欧宝娱乐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__));$requestContext=新RequestContext ($_SERVER[“REQUEST_URI”]);$路由器=新路由器(新YamlFileLoader ($定位器),“routes.yml”,数组(“cache_dir”= >__DIR__./缓存的),$requestContext);$路由器->匹配(“/ foo / bar”);
请注意
如果使用缓存,Routing组件将编译保存在cache_dir
.这意味着您的脚本必须具有该位置的写权限。