路由组件
编辑本页路由组件
在我们开始深入路由组件之前,让我们稍微重构一下当前的框架,使模板更具可读性:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
/ / example.com/web/front.phprequire_once__DIR__.“/ . . /供应商/ autoload.php”;使用ob娱乐下载\组件\HttpFoundation\请求;使用ob娱乐下载\组件\HttpFoundation\响应;$请求=请求::createFromGlobals ();$地图= (' /你好'= >“你好”,' /再见'= >“再见”,);$路径=$请求->getPathInfo ();如果(收取($地图[$路径])) {ob_start();提取($请求->查询->所有(),EXTR_SKIP);包括sprintf (__DIR__.“/ . . / src /页面/ % s.php ',$地图[$路径]);$响应=新响应(ob_get_clean ());}其他的{$响应=新响应(“没有找到”,404);}$响应->send ();
当我们现在提取请求查询参数时,简化hello.php
模板如下:
1 2
<!——example.com/src/pages/hello.php——>你好< ?=:收取($的名字) ?$的名字:“世界”ENT_QUOTES,“utf - 8”)? >
现在,我们已经准备好添加新特性了。
任何网站的一个非常重要的方面是它的url的形式。由于有了URL映射,我们已经将URL与生成关联响应的代码解耦,但它还不够灵活。例如,我们可能想要支持动态路径,以允许将数据直接嵌入到URL中。/ hello /法比安
)而不是依赖于查询字符串(例如。/你好吗?的名字=Fabien
).
为了支持这个特性,添加Symfony Routing组件作为依赖项ob娱乐下载:
1
$Composer需要symfonyob娱乐下载/routing
路由组件依赖于一个数组来代替URL映射RouteCollection
实例:
1 2 3
使用ob娱乐下载\组件\路由\RouteCollection;$路线=新RouteCollection ();
让我们添加一个路由来描述/ hello /东西
URL并添加另一个简单的/再见
一:
1 2 3 4
使用ob娱乐下载\组件\路由\路线;$路线->add (“你好”,新路线(“/ hello /{名称}”, (“名字”= >“世界”)));$路线->add (“再见”,新路线(' /再见'));
集合中的每个条目都由一个名称(你好
)和a路线
实例,该实例由路由模式(/ hello /{名称}
)和路由属性的默认值数组(['name' => 'World']
).
请注意
读了路由的文档欧宝官网下载app了解它的许多特性,如URL生成、属性需求、HTTP方法强制、YAML或XML文件的加载器、PHP或Apache重写规则的转储器,以增强性能等等。
根据所存储的信息RouteCollection
实例,UrlMatcher
实例可以匹配URL路径:
1 2 3 4 5 6 7 8
使用ob娱乐下载\组件\路由\匹配器\UrlMatcher;使用ob娱乐下载\组件\路由\RequestContext;$上下文=新RequestContext ();$上下文->fromRequest ($请求);$匹配器=新UrlMatcher ($路线,$上下文);$属性=$匹配器->匹配($请求->getPathInfo ());
的匹配()
方法接受一个请求路径并返回一个属性数组(请注意,匹配的路由自动存储在特殊的_route
属性):
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22
$匹配器->匹配(' /再见');/* Result: ['_route' => 'bye',];* /$匹配器->匹配(' / hello /法”);/ *结果:['名字' = > '法',' _route ' = > '你好',);* /$匹配器->匹配(' /你好');/ *结果:['名字' = > '世界',' _route ' = > '你好',);* /
请注意
即使我们在示例中并不严格需要请求上下文,但在实际应用程序中也会使用它来加强方法需求等。
URL匹配器在没有路由匹配时抛出异常:
1 2 3
$匹配器->匹配(' /找不到');//抛出Symfony\ob娱乐下载Component\Routing\Exception\ResourceNotFoundException异常
有了这些知识,让我们来编写框架的新版本:
12 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
/ / example.com/web/front.phprequire_once__DIR__.“/ . . /供应商/ autoload.php”;使用ob娱乐下载\组件\HttpFoundation\请求;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\路由;$请求=请求::createFromGlobals ();$路线=包括__DIR__.“/ . . / src / app.php”;$上下文=新路由\ RequestContext ();$上下文->fromRequest ($请求);$匹配器=新路由\匹配器\ UrlMatcher ($路线,$上下文);试一试{提取($匹配器->匹配($请求->getPathInfo ()), EXTR_SKIP);ob_start ();包括sprintf (__DIR__.“/ . . / src /页面/ % s.php ',$_route);$响应=新响应(ob_get_clean ());}抓(路由\异常\ ResourceNotFoundException$异常) {$响应=新响应(“没有找到”,404);}抓(异常$异常) {$响应=新响应(“发生错误”,500);}$响应->send ();
代码中有一些新东西:
- 路由名称用于模板名称;
500
错误现在得到了正确的管理;- 提取请求属性以保持模板的简单性:
1 2
// example.com/src/pages/hello.php你好< ?=:$的名字ENT_QUOTES,“utf - 8”)? >
路由配置已经移动到它自己的文件:
1 2 3 4 5 6 7 8
/ / example.com/src/app.php使用ob娱乐下载\组件\路由;$路线=新路由\ RouteCollection ();$路线->add (“你好”,新路由\路线(“/ hello /{名称}”, (“名字”= >“世界”)));$路线->add (“再见”,新路由\路线(' /再见'));返回$路线;
现在,我们在配置(特定于应用程序的所有内容)之间有了清晰的分离app.php
)和框架(为应用程序提供动力的通用代码)front.php
).
用不到30行代码,我们就有了一个新的框架,它比以前的框架更强大、更灵活。享受吧!
使用Routing组件还有一个很大的额外好处:能够根据Route定义生成url。当在代码中同时使用URL匹配和URL生成时,更改URL模式应该没有其他影响。你可以这样使用生成器:
1 2 3 4 5 6
使用ob娱乐下载\组件\路由;$发电机=新路由\发电机\ UrlGenerator ($路线,$上下文);回声$发电机->生成(“你好”, (“名字”= >“法”]);//输出/hello/Fabien
代码应该是不言自明的;多亏了上下文,你甚至可以生成绝对url:
1 2 3 4 5 6 7 8
使用ob娱乐下载\组件\路由\发电机\UrlGeneratorInterface;回声$发电机->生成(“你好”, (“名字”= >“法”), UrlGeneratorInterface::ABSOLUTE_URL);//输出类似http://example.com/somewhere/hello/Fabien的内容
提示
关心性能?根据您的路由定义,创建一个高度优化的URL匹配器类,可以替换默认的UrlMatcher
:
1 2 3 4 5 6 7 8
使用ob娱乐下载\组件\路由\匹配器\CompiledUrlMatcher;使用ob娱乐下载\组件\路由\匹配器\自动倾卸车\CompiledUrlMatcherDumper;// $ compiledroues是一个简单的PHP数组,以性能数据格式描述所有路由//你可以(并且应该)缓存它,通常是通过将它导出到一个PHP文件$compiledRoutes= (新CompiledUrlMatcherDumper ($路线))->getCompiledRoutes ();$匹配器=新CompiledUrlMatcher ($compiledRoutes,$上下文);