路由组件
编辑该页面路由组件
在开始深入路由组件之前,让我们重构当前框架使模板更加可读的一点:
1 2 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 /法比安
),而不是依靠一个查询字符串(例如/你好吗?名字=法比安
)。
支持此功能,添加Symfony路由组件依赖关系:ob娱乐下载
1
美元作曲家需要symfony /路由ob娱乐下载
而不是数组的URL映射,依赖于路由组件RouteCollection
实例:
1 2 3
使用ob娱乐下载\组件\路由\RouteCollection;美元路线=新RouteCollection ();
让我们添加一个描述/ hello /东西
简单的URL并添加另一个/再见
一:
1 2 3 4
使用ob娱乐下载\组件\路由\路线;美元路线- >add (“你好”,新路线(“/ hello /{名称}”,(“名字”= >“世界”)));美元路线- >add (“再见”,新路线(' /再见'));
集合中的每个条目被定义为一个名称(你好
)和一个路线
实例,它被定义为一个路由模式(/ hello /{名称}
)和一组路由的默认值属性(['名字' = > '世界']
)。
请注意
读了路由的文档欧宝官网下载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
属性):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
美元匹配器- >匹配(' /再见');/ *结果:[' _route ' = > '再见',);* /美元匹配器- >匹配(' / hello /法”);/ *结果:['名字' = > '法',' _route ' = > '你好',);* /美元匹配器- >匹配(' /你好');/ *结果:['名字' = > '世界',' _route ' = > '你好',);* /
请注意
即使我们不严格需要请求上下文在我们的例子中,它是用于执行方法的实际应用需求和更多。
匹配器的URL将抛出一个异常时没有路线匹配:
1 2 3
美元匹配器- >匹配(' /找不到');/ /抛出一个Symfoob娱乐下载ny \组件\路由\ \ ResourceNotFoundException异常
记住这些知识,让我们写新版本的框架:
1 2 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行代码,我们有一个新的框架,比以前更强大和更灵活。享受吧!
使用路由组件有一个额外的好处:能够根据路线生成url定义。当使用的URL匹配和URL生成代码,改变URL模式应该没有其他的影响。您可以使用发电机:
1 2 3 4 5 6
使用ob娱乐下载\组件\路由;美元发电机=新路由\发电机\ UrlGenerator (美元路线,美元上下文);回声美元发电机- >生成(“你好”,(“名字”= >“法”]);/ /输出/ hello /法比安
代码应该是自解释的。由于上下文,您甚至可以生成绝对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;/ / compiledRoutes美元是一个简单的PHP数组,描述所有线路性能数据格式/ /你可以(也应该)缓存,通常通过出口到一个PHP文件美元compiledRoutes= (新CompiledUrlMatcherDumper (美元路线))- >getCompiledRoutes ();美元匹配器=新CompiledUrlMatcher (美元compiledRoutes,美元上下文);