路由组件

编辑本页

路由组件

在我们开始深入路由组件之前,让我们稍微重构一下当前的框架,使模板更具可读性:

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上下文);
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。
ob娱乐下载Symfony 6.2支持通过苏禄人
ob娱乐下载Symfony 6.2支持通过Les-Tilleuls.coop