路由组件
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 3.0,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
路由组件
在我们开始深入路由组件之前,让我们稍微重构一下当前的框架,使模板更具可读性:
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——->你好<?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娱乐下载\组件\路由\RequestContext;使用ob娱乐下载\组件\路由\匹配器\UrlMatcher;$上下文=新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
print_r ($匹配器->匹配(' /再见'));/*给出:array ('_route' => 'bye',);* /print_r ($匹配器->匹配(' / hello /法”));/ *给:数组('名字' = > '法',' _route ' = > '你好',);* /print_r ($匹配器->匹配(' /你好'));/ *给:数组('名字' = > '世界',' _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$e) {$响应=新响应(“没有找到”,404);}抓(异常$e) {$响应=新响应(“发生错误”,500);}$响应->send ();
代码中有一些新东西:
- 路由名称用于模板名称;
500
错误现在得到了正确的管理;提取请求属性以保持模板的简单性:
1 2
<!——example.com/src/pages/hello.php——->你好<?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
$自动倾卸车=新路由\匹配器\翻车机\ PhpMatcherDumper ($路线);回声$自动倾卸车->dump ();