hehex / hehep-hrouter
hehep-hrouter 是一个PHP路由基础组件,支持注释注解,PHP8原生注解,支持分组路由,支持key/value结构存储路由,支持合并路由解析操作,支持路由缓存,快速定位路由,提高匹配效率
v1.0.0
2024-08-31 07:24 UTC
Requires
- php: >=7.1
This package is auto-updated.
Last update: 2025-04-29 01:36:37 UTC
README
介绍
- hehep-hrouter 是一个PHP 路由工具组件
- 支持注释注解,PHP8原生注解
- 支持分组路由
- 支持key/value结构存储路由,快速定位路由,提高匹配效率
- 支持合并路由解析,提高匹配效率
- 支持路由缓存
安装
- gitee下载:
git clone git@gitee.com:chinahehex/hehep-hrouter.git
- github下载:
git clone git@github.com:chinahehex/hehep-hrouter.git
- 命令安装:
composer require hehex/hehep-hrouter
组件配置
$route_conf = [ // 路由请求定义 'routeRequest'=>[ 'class'=>'WebRouterRequest', 'attr1'=>'参数1', 'attr2'=>'参数2' ], // 路由解析器定义 'routeMatcher'=>[ 'class'=>'hehe\core\hrouter\fast\FastRouteMatcher', 'suffix'=>true,// 全局前缀 'domain'=>false,// 生产url 地址时是否显示域名 'mergeRule'=>false, // 是否合并路由解析 'mergeLen'=>0,// 一次合并的条数 'lazy'=>true,// 是否延迟加载规则 ], // 路由缓存配置 'routeCache' => [ 'routeFile'=>[],// 路由文件 'cacheDir'=>'',// 缓存目录 'timeout'=>0,// 缓存过期时间,0表示一直有效 ], // 路由规则列表 'rules'=>[ // 常规路由规则定义 '<controller:\w+>/<action:\w+>'=>'<controller>/<action>', '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',// 设置id类型 '<controller:\w+>/<action:\w+>/<id:\d+?>'=>'<controller>/<action>',// 设置id可选 '<module:\w+/?><controller:\w+>/<action:\w+>/<id:\d+?>'=>'<module><controller>/<action>',// 设置module可选,并带有"/" // 数组格式 ['uri'=>'<controller:\w+>/<action:\w+>','action'=>"<controller>/<action>","method"=>"get"], // 参数解析格式:"param" 参数解析地址 [ 'uri'=>'<controller:\w+>/<action:\w+>/thread<param:.*>', 'action'=>'<controller>/<action>', 'prule'=>['pvar'=>'param','class'=>'value','names'=>['id','status','type']] ], ], ];
路由配置
路由管理器
- 说明
路由管理器:收集路由信息,配置路由请求,管理路由解析器,管理路由缓存,解析url地址,生成url 地址
- 路由管理器操作方式
use hehe\core\hrouter\RouteManager; use hehe\core\hrouter\Route; // 创建路由管理器对象 $hrouter = new RouteManager([]); // 设置路由请求,路由解析器 $hrouter->setRouteMatcher([])->setRouteRequest([]); // 收集路由 Route::get("user/get","user/get"); $hrouter->addRoute("user/<id:\d+>","user/get","get"); // 解析URL地址,并返回结果(假如访问网址"user/123") $matchingResult = $hrouter->parseRequest(); $action = $matchingResult->getUri();// 获取解析后的"路由地址" $params = $matchingResult->getParams();// 获取解析后的额外参数 $rule = $matchingResult->getRule();// 获取匹配到的路由规则对象 // $action 结果:user/get,$params: ["id"=>123] // 生成URL地址 $url = $hrouter->buildUrL("user/get",["id"=>122]); // $url 结果:user/122
- 路由器操作方式
use hehe\core\hrouter\RouteManager; use hehe\core\hrouter\Route; // 创建路由管理器对象 $hrouter = Route::intiRoute(); // 设置路由请求,路由解析器 $hrouter->setRouteMatcher([])->setRouteRequest([]); // Route::intiRoute(AppRouteRequest:class) // Route::intiRoute('WebRouteRequest') // 收集路由 Route::get("user/get","user/get"); Route::addRoute("user/<id:\d+>","user/get","get"); // 解析URL地址,并返回结果(假如访问网址"user/123") $matchingResult = Route::parseRequest(); $action = $matchingResult->getUri();// 获取解析后的"路由地址" $params = $matchingResult->getParams();// 获取解析后的额外参数 $rule = $matchingResult->getRule();// 获取匹配到的路由规则对象 // $action 结果:user/get,$params: ["id"=>123] // 生成URL地址 $url = Route::buildUrL("user/get",["id"=>122]); // $url 结果:user/122
路由请求
- 说明
路由请求类:存储路由解析器需要的数据,比如路由请求对象可以提供pathinfo地址,host,method 等数据
默认路由请求类:
WebRouteRequest:常规web路由请求,比如php+nginx 环境下运行web请求
ConsoleRouteRequest:控制台路由请求,比如php脚本环境下运行脚本请求
- 定义路由请求类
namespace hehe\core\extend; use hehe\core\hrouter\base\RouteRequest; use Exception; use he; class AppRouteRequest extends RouteRequest { // 定义获取pathinfo 地址的方法 public function getPathinfo():string { return he::$ctx->hrequest->getPathInfo(); } // 定义获取请求类型的方法 public function getMethod():string { return strtolower(he::$ctx->hrequest->getMethod()); } // 定义获取host的方法 public function getHost():string { return he::$ctx->hrequest->getHostInfo(); } }
- 路由请求使用示例
use hehe\core\hrouter\RouteManager; use hehe\core\extend\AppRouteRequest; // 创建路由管理器对象 $hrouter = new RouteManager([]); // 设置路由请求配置 $hrouter->setRouteRequest([]); // 创建路由请求对象 $hrouter->createRouteRequest(); // 创建路由请求对象 $routeRequest = new AppRouteRequest(); // 解析URL地址 $matchingResult = $hrouter->parseRequest($routeRequest); // 获取解析结果 $action = $matchingResult->getUri();// 获取解析后的"路由地址" $params = $matchingResult->getParams();// 获取解析后的额外参数 $rule = $matchingResult->getRule();// 获取匹配到的路由规则对象
路由解释器
- 说明
路由解释器类:负责调度规则,解析路由规则,生成后缀,域名等等
路由解析由两部分组成:地址(pathinfo)解析+参数解析
格式:user/list/blog-12-12-12.html,pathinfo:user/list/blog,参数:-12-12-12
路由解释器属性:
suffix:url 是否加入上后缀,默认值:false,格式:html
domain:url 是否加入域名 地址时是否显示域名,格式:http://www.xxx.cn
mergeRule: 是否合并路由解析,默认值:false,此参数会同步至分组
mergeLen:一次合并的条数,0 表示全部
lazy:是否延迟加载规则,默认值:false
- 定义路由解释器类
namespace hehe\core\hrouter\fast; use hehe\core\hrouter\base\RouteRequest; use hehe\core\hrouter\base\Rule; use hehe\core\hrouter\Route; use hehe\core\hrouter\RouteManager; class FastRouteManager extends RouteManager { // 收集路由规则 public function addRule(Rule $rule):void { } // 解析路由请求,调用路由规则 public function matchRequest(RouteRequest $routeRequest) { } // 匹配action规则 public function matchAction(string $uri = '',array $params = [],array $options = []) { } }
- 路由解析器使用示例
use hehe\core\hrouter\RouteManager; // 创建路由管理器对象 $hrouter = new RouteManager([]); $hrouter->setRouteMatcher([ 'class'=>'hehe\core\hrouter\fast\FastRouteMatcher', 'suffix'=>false,// url 地址后缀 // url 是否加入域名 'domain'=>false,// 生产url 地址时是否显示域名, // 是否合并路由解析 'mergeRule'=>false, // 一次合并的条数 'mergeLen'=>0, // 是否延迟加载规则 'lazy'=>true, ]); // 获取路由解释器对象 $routeMatcher = $hrouter->getRouteMatcher(); // 解析URL地址 $matchingResult = $hrouter->parseRequest(); // 是否匹配成功 $matchingResult->isMatchSuccess(); // 获取解析结果 $action = $matchingResult->getUri();// 获取解析后的"路由地址" $params = $matchingResult->getParams();// 获取解析后的额外参数 $rule = $matchingResult->getRule();// 获取匹配到的路由规则对象
路由缓存
- 说明
路由缓存类:由于路由规则是动态生成的,所以需要缓存路由规则,以便下次使用
路由缓存属性:
routeFile:路由文件列表
cacheDir:路由缓存目录
cacheFile:路由缓存文件,如果路由缓存文件未设置,则生成路由缓存文件
timeout:路由缓存过期时间,默认值:0,0 表示不过期
- 路由缓存使用示例
use hehe\core\hrouter\RouteManager; use hehe\core\hrouter\Route; // 设置路由缓存配置 Route::setRouteCache([ 'cacheDir'=>'/www/cache/route', 'timeout'=>30, ]); // 获取路由缓存对象 $routeCache = Route::getRouteCache(); $routeCache->addRouteFile('file1','file2'); // 导入路由文件 $routeCache->requireRouteFile(); // 检查缓存是有效 $routeCache->checkCacheStatus(); // 注入缓存路由至路由收集器 $routeCache->injectRules(); // 清除路由缓存 $routeCache->clearRouteCache(); // 开始解析路由请求 $matchingResult = Route::parseRequest(); // 生成URL地址 Route::buildUrL('user/get',["id"=>123]);
路由定义
说明
基本格式:["uri"=>"<controller:\w+>/<action:\w+>","action"=>"<controller>/<action>","method"=>"get"]
伪代码: Route::get("路由规则","路由地址");
变量参数:格式<变量名>,<变量名:正则表达式> 或{变量名},{变量名:正则表达式},如<controller:\w+>
uri:路由规则,即匹配http地址的规则表达式
action:路由地址,即匹配"控制器/操作"的表达式,常用于生成url地址
method:请求类型,多个请求类型逗号或|隔开,目前支持以下请求类型
*(任意类型),GET,POST,PUT,DELETE,PATCH,HEAD
常规路由
use hehe\core\hrouter\Route; Route::addRoute("user/add","user/doadd");// 任意请求类型 Route::addRoute("user/add","user/doadd","*");// 任意请求类型 Route::addRoute("user/add","user/doadd","get"); Route::addRoute("user/add","user/doadd","get,post"); Route::addRoute("user/add","user/doadd","get|post"); Route::get("user/add","user/doadd"); Route::get("<controller:\w+>/<action:\w+>","<controller>/<action>");
变量路由
use hehe\core\hrouter\Route; Route::get("user/<id:\d+>","user/get"); Route::get("user/<id>","user/get")->asParams(["id"=>"\d+"]); // 正确url地址:user/122,错误url地址:user/add Route::get("user/<action:\w+>","user/<action>"); // 正确url地址:user/get,user/list,错误url地址:user/123 Route::get("user/<action:get|list>","user/<action>"); // 正确url地址:user/get,user/list,错误url地址:user/edit
可选变量路由
- 说明
在变量表达式中末尾带?问号,标识此变量为可选,即可有可无
以下格式可设置为可选变量:
<id:\d+?>
<id?>
->asParams(["id"=>"\d+?"])
- 示例代码
use hehe\core\hrouter\Route; Route::get("user/add/<id:\d+?>","user/add"); Route::get("user/add/<id?>","user/add")->asParams(["id"=>"\d+"]); Route::get("user/add/<id>","user/add")->asParams(["id"=>"\d+?"]); // 正确url地址:user/add/122,user/add/ // 带"/" 路由 Route::get("user/add<id:/\d+?>","user/add"); Route::get("user/add<id?>","user/add")->asParams(["id"=>"/\d+"]); Route::get("user/add<id>","user/add")->asParams(["id"=>"/\d+?"]); // 正确url地址:user/add/122,user/add Route::get("<module:\w+/?>news/<action:get|list>","<module>news/<action>"); // 正确url地址:content/news/get,对应的路由地址:content/news/get // 正确url地址:news/list,对应的路由地址:news/list
私有变量路由
- 说明
私有变量格式:<_变量名:正则表达式>,变量名以下划线(_)开头
私有变量规则:私有变量只负责验证,不会出现在解析URL地后的参数里
- 示例代码
use hehe\core\hrouter\Route; $hrouter = new RouteManager(); Route::addGroup("<_ssl:http|https>://www.xxx.cn",function(){ Route::get("news/list","news/list"); Route::get("news/get/<id:\d+>","news/get"); })->asDefaults(['ssl'=>'http']); // 解析http:http://www.xxx.cn/news/list,返回:url:news/news,$params:[] // 解析http:https://www.xxx.cn/news/get/1,返回:url:news/get,$params:["id"=>1] $url = $hrouter->buildUrL("news/list"); // $url:http://www.xxx.cn/news/list $url = $hrouter->buildUrL("news/list",["ssl"=>'https']); // $url:https://www.xxx.cn/news/list
默认变量路由
- 说明
提示:带问号(?)可选默认变量值不会现在"路由规则","路由地址"里
- 非可选默认变量
use hehe\core\hrouter\RouteManager; use hehe\core\hrouter\Route; $hrouter = new RouteManager(); Route::get("<lang:\w+>/news/list","news/list") ->asDefaults(['lang'=>'ch']); // 解析pathinfo:ch/news/list,返回:url:news/list,$params:["lang"=>'ch'] // 解析pathinfo:en/news/list,返回:url:news/list,$params:["lang"=>'en'] $url = $hrouter->buildUrL("news/list",["lang"=>"ch"]); // $url:ch/news/list $url = $hrouter->buildUrL("news/list",["lang"=>"en"]); // $url:en/news/list
- 带问号(?)可选默认变量
use hehe\core\hrouter\RouteManager; use hehe\core\hrouter\Route; $hrouter = new RouteManager(); // 带?问号 Route::get("<lang:\w+/?>news/list","news/list") ->asDefaults(['lang'=>'ch']); // 解析pathinfo:ch/news/list,返回:url:news/list,$params:["lang"=>'ch'] // 解析pathinfo:en/news/list,返回:url:news/list,$params:["lang"=>'en'] // 解析pathinfo:news/list,返回:url:news/list,$params:["lang"=>'ch'] $url = $hrouter->buildUrL("news/list",["lang"=>"ch"]); // $url:news/list $url = $hrouter->buildUrL("news/list",["lang"=>"en"]); // $url:en/news/list $url = $hrouter->buildUrL("news/list",["lang"=>"ch"]); // $url:news/list // 变量带?问号,且路由地址(action)带此变量 Route::get("<lang:\w+/?>abc/list","<lang>abc/plist") ->asDefaults(['lang'=>'ch']); // 解析pathinfo:ch/news/list,返回:url:news/list,$params:[] // 解析pathinfo:en/news/list,返回:url:en/news/list,$params:[] // 解析pathinfo:news/list,返回:url:news/list,$params:[] $url = $hrouter->buildUrL("news/list",["lang"=>"ch"]); // $url:news/list $url = $hrouter->buildUrL("news/list",["lang"=>"en"]); // $url:en/news/list $url = $hrouter->buildUrL("ch/news/list"); // $url:news/list $url = $hrouter->buildUrL("en/news/list"); // $url:en/news/list
带域名路由
use hehe\core\hrouter\RouteManager; use hehe\core\hrouter\Route; Route::get('http://www.hehep.cn/news/list','news/list'); Route::get('news/list','news/list')->asDomain("http://www.hehep.cn"); Route::get('http://user<userid:\d+>.hehep.cn/news/<id:\d+>','news/get'); Route::get('news/<id:\d+>','news/get')->asDomain("http://user<userid:\d+>.hehep.cn"); $hrouter = new RouteManager(); $uri = $hrouter->buildUrl('news/list'); // $uri:http://www.hehep.cn/news/list $uri = $hrouter->buildUrl('news/get',['userid'=>2260,'id'=>1]); // $uri:http://user2260.hehep.cn/news/1
绑定类路由
- 说明
基本格式:完整类路径@方法名
类方法路由只能用于解析uri地址,无法用于生成uri地址
- 示例代码
Route::get("user/add","app/user/AdminController@add"); Route::get("user/<action:\w+>","app/user/AdminController@<action>");
常用变量表达式
表达式 | 说明 | 示例 |
---|---|---|
\w+ |
由数字、26个英文字母,下划线 | 'user/<action:\w+>' |
\d+ |
非负整数(正整数 + 0) | 'user/<id:\d+>' |
[a-z]+ |
26个小写字母 | 'http://<lang:[z-z]+>.xxx.cn' |
.+ ,.* |
任意字符 | 'user/get<param:.+>' |
\d{4} |
日期格式 | news/list/<year:\d{4}>/<month:\d{2}>/<day:\d{2}> |
[^\/]+ |
匹配除了'/'以外的字符 | news/search/<keyword:[^\/]+> |
路由规则参数
- 路由参数集合
参数 | 说明 | 方法名 | 示例 |
---|---|---|---|
domain |
是否域名检测 | asDomain | asDomain(true) |
suffix |
生成URL是否加入后缀 | asSuffix | asSuffix("html") |
method |
请求类型 | asMethod | asMethod("get") |
id |
路由唯一标识 | asId | asId("news") |
params |
"路由规则"变量集合 | asParams | asParams(["id"=>"\d+"]) |
defaults |
默认变量集合 | asDefaults | asDefaults(['lang'=>'en']) |
completeMatch |
是否完全匹配路由规则,默认完全匹配 | asCompleteMatch | asCompleteMatch(false) |
prule |
Url参数配置规则 | asParamsRule | asParamsRule(['pvar'=>'params','class'=>'xxx']) |
- 示例代码
use hehe\core\hrouter\RouteManager; use hehe\core\hrouter\Route; // 设置"路由规则"变量 Route::get("user/<id>","user/get") ->asParams(["id"=>"\d+"]); // 设置生成URL后缀,生成的URL地址为:user/{id}.html Route::get("user/<id:\d+>","user/get") ->asSuffix(); // 设置路由唯一标识,生成地址时,直接使用"news_id"定位此条规则,避免了遍历查找 Route::get("news/<id:\d+>","news/get") ->asId("news_id"); $htouer = new RouteManager(); /** 使用"news"生成URL地址,最后地址为:"news/122" **/ $htouer->buildUrL("news_id",["id"=>122]); // 设置默认变量 Route::get("news/list/<page:\d+>","news/list") ->asDefaults(["page"=>1]); Route::get("<language:\w+/?>news/list","news/list") ->asDefaults(['language'=>'ch']);
分组路由
- 说明
分组路由目的:集中统一设置参数,提高匹配效率
分组路由规则:子路由参数优先于分组路由参数,即分组设置的参数无法覆盖子路由设置的参数
- 示例代码
use hehe\core\hrouter\Route; Route::addGroup("blog",function(){ Route::addRoute("list","blog/list"); Route::get("get/<id>","blog/get"); Route::post("add","blog/doadd"); Route::get("add","blog/doadd"); });
设置规则参数
use hehe\core\hrouter\Route; Route::addGroup("blog",function(){ Route::addRoute("list","list"); Route::get("get/<id>","get")->asParams(["id"=>"\d+"]); Route::post("add","doadd"); Route::get("/hblog/add","doadd"); Route::get("page","page/list"); })->asPrefix("hblog/"); // 分组后相当于 // Route::addRoute("blog/list","hblog/list"); // Route::get("blog/get/<id:\d+>","hblog/get")->asParams(["id"=>"\d+"]); // Route::post("blog/add","hblog/doadd"); // Route::get("hblog/add","hblog/doadd"); // Route::get("blog/page","hblog/page/list");
带变量分组
use hehe\core\hrouter\Route; Route::addGroup("<module:\w+>/blog",function(){ Route::addRoute("list","list"); Route::get("get/<id>","get")->asParams(["id"=>"\d+"]); Route::post("add","doadd"); Route::get("/hblog/add","/hblog/doadd"); Route::get("page","page/list")->asSuffix("shtml"); })->asMethod("get") ->asPrefix("<module>/hblog/") ->asSuffix("html"); // 分组后相当于 // Route::addRoute("<module:\w+>/blog/list","<module>/hblog/list")->asSuffix("html"); // Route::get("<module:\w+>/blog/get/<id:\d+>","<module>/hblog/get")->asParams(["id"=>"\d+"])->asSuffix("html"); // Route::post("<module:\w+>/blog/add","<module>/hblog/doadd")->asSuffix("html"); // Route::get("hblog/add","hblog/doadd")->asSuffix("html"); // Route::get("<module:\w+>/blog/page","<module>/hblog/page/list")->asSuffix("shtml");
合并路由解析
- 说明
合并解析目的:提高匹配效率
合并原则:只合并相同请求类型的路由
可选参数:支持指定合并的条数
- 示例代码
use hehe\core\hrouter\Route; // 只能相同请求类型的路由规则合并 // get/<id>,geta/<id>,getb/<id> 合并成一条正则表达式进行验证, Route::addGroup("blog",function(){ Route::get("get/<id>","get"); Route::get("geta/<id>","geta"); Route::get("getb/<id>","getb"); })->asMethod("get")->asParams(["id"=>"\d+"])->asMergeRule(); // 指定路由规则每次合并数量,如合并数量为2时, (get/<id>,geta/<id>)一组合并,(getb/<id>)单独一组, Route::addGroup("blog",function(){ Route::get("get/<id>","get"); Route::get("geta/<id>","geta"); Route::get("getb/<id>","getb"); })->asMethod("get")->asParams(["id"=>"\d+"])->asMergeRule(2);
分组参数同步子路由
参数 | 方法 | 分组路由 | 子路由 | 同步至子路由 | 说明 |
---|---|---|---|---|---|
suffix |
asSuffix() | ✓ | ✓ | ✓ | 统一设置子路由后缀 |
id |
asId() | ✓ | ✓ | ✓ | 统一设置子路由的id前缀,如分组id:admin::,如子路由id:user,最终子路由id:admin::user |
params |
asParams() | ✓ | ✓ | ✓ | 统一设置子路由变量,子路由变量与分组变量合并,并且子路由变量优先 |
prefix |
asPrefix("blog/") | ✓ | ✗ | ✓ | 统一设置子路由action前缀(首字符为"/"的除外),分组prefix:blog/,子路由action:list,最终子路由action:blog/list |
mergeRule |
asMergeRule(5) | ✓ | ✗ | ✗; | 路由规则合并成一条正则表达式进行验证,可以指定一次合并N条 |
域名路由
- 常规域名路由
use hehe\core\hrouter\Route; Route::get("http://<language:[a-z]+>.xxx.com/user/get","user/get") ->asDefaults(["language"=>'ch']); Route::get("user/get","user/get") ->asDefaults(["language"=>'ch'])->asDomain("http://<language:[a-z]+>.xxx.com");
- 分组域名路由
Route::addGroup("<_ssl:http|https>://www.xxx.cn",function(){ Route::get("news/list","news/list"); Route::get("news/get/<id:\d+>","news/get"); })->asDefaults(['ssl'=>'http']);
URL参数解析
分隔符(split)格式
- 说明
基本格式:thread-119781-1.html
类属性如下:
pvar:URL地址参数解析名称,与"路由规则"中URL参数解析名称对应,比如uri:xxx/thread<hvar:(.*)>,pvar值为:hvar
names:参数项名称,默认值,正则表达式,以及顺序定义.
格式:['status'=>["regex"=>"正则表达式","defval"=>"默认值"]]
格式1:['id','status'=>"默认值",'type']
格式2:['id'=>["regex"=>'\d+',"defval"=>"0"],'status'=>["regex"=>'\d+',"defval"=>"0"],'type']
flag:参数项之间的分隔符,默认是中划线-,比如"thread-122-1-1.html"地址中的"122-1-1"
prefix:参数前缀,默认是中划线-,比如"thread-122-1-1.html"地址中的122前面的中划线-
defval:全局默认值
mode:参数数量类型,fixed:固定参数,dynamic:动态参数
固定参数:fixed,如设置names=['id','status'=>"0",'type'],
URL参数格式1,如thread-119781-1-1.html,错误格式thread-119781-1.html
生成URL格式1:["id"=>122,"type"=>1],得到的URL:xxxx/thread-122-0-1.html
动态参数:dynamic,如设置names=["id",'status'=>"0",'type']
URL参数格式1:如thread-119781.html,解析后得到的参数$params = ["id"=>119781,"status"=>0];
URL参数格式2:如thread-119781-1.html,解析后得到的参数$params = ["id"=>119781,"status"=>1];
URL参数格式3:如thread-119781-1-1.html,解析后得到的参数$params = ["id"=>119781,"status"=>1,"type"=>1];
生成URL格式1:["id"=>122,"type"=>1],得到的URL:xxxx/thread-122-0-1.html
生成URL格式2:["id"=>122],得到的URL:xxxx/thread-122-0.html
生成URL格式3:["id"=>122,"status"=>1,"type"=>1],得到的URL:xxxx/thread-122-1-1.html
- 动态参数模式
use hehe\core\hrouter\Route; // 动态参数类型,解析的参数格式如下:thread-119781-1-1.html Route::get([ 'uri'=>'<controller:\w+>/<action:\w+>/thread<param:.*>', 'action'=>'<controller>/<action>', 'prule'=>[ 'pvar'=>'param', 'class'=>'split',// 参数解析器类路径 'mode'=>'dynamic',// fixed:固定参数,dynamic:动态参数 // 所有参数的默认值以及顺序,如thread-{id}-{status}-{type}.html 'names'=>['id','status'=>"0",'type'], ] ]); Route::get('<controller:\w+>/<action:\w+>/thread<param:.*>','<controller>/<action>') ->asParamsRule([ 'pvar'=>'param', 'class'=>'split', 'mode'=>'fixed', 'names'=>['id','status'=>"0",'type'] ]); // URL地址:news/get/thread-119781-1-1.html,$action::news/get,$params:["id"=>119781,"status"=>1,"type"=>1] // URL地址:news/get/thread-119781.html,$action::news/get,$params:["id"=>119781,"status"=>0] // 生成URL:["id"=>122,"type"=>1],得到的URL:xxx/thread-122-0-1.html // 生成URL:["id"=>122],得到的URL:xxx/thread-122-0.html
- 固定参数模式
use hehe\core\hrouter\Route; Route::get([ 'uri'=>'<controller:\w+>/<action:\w+>/thread<param:.*>', 'action'=>'<controller>/<action>', 'prule'=>[ 'pvar'=>'param', 'class'=>'split',// 参数解析器类路径 'mode'=>'fixed',// fixed:固定参数,dynamic:动态参数 // 所有参数的默认值以及顺序,如thread-{id}-{status}-{type}.html 'names'=>['id','status'=>"0",'type'], ] ]); Route::get('<controller:\w+>/<action:\w+>/thread<param:.*>','<controller>/<action>') ->asParamsRule([ 'pvar'=>'param', 'class'=>'split', 'mode'=>'fixed', 'names'=>['id','status'=>"0",'type'] ]); // URL地址:news/get/thread-119781-1-2.html,$action::news/get,$params:["id"=>119781,"status"=>1,"type"=>2] // URL地址:news/get/thread-119781-0-1.html,$action::news/get,$params:["id"=>119781,"status"=>0,"type"=>2] // 生成URL:["id"=>122],得到的URL:xxx/thread-122-0.html // 生成URL:["id"=>122,"type"=>1],得到的URL:xxxx/thread-122-0-1.html
PATHINFO分隔格式
- 说明
基本格式:名称/值1/名称/值2/名称/值3,如:news/get/id/1/status/1
属性如下:
valueSplit:参数名与值的分隔符,默认"/",如id/1
paramSplit:参数与参数的分隔符,默认"/",如id/1/status/1,id-1/status-1
prefix:参数前缀,默认""
names:参数项名称,默认值,正则表达式,以及顺序定义.
格式:['status'=>["regex"=>"正则表达式","defval"=>"默认值"]]
格式1:['id','status'=>"默认值",'type']
格式2:['id'=>["regex"=>'\d+',"defval"=>"0"],'status'=>["regex"=>'\d+',"defval"=>"0"],'type']
defval:全局默认值
- 示例代码
use hehe\core\hrouter\Route; // 解析的参数格式如下:news/get/id/1/status/1 Route::get([ 'uri'=>'<controller:\w+>/<action:\w+>/<param:\w+>', 'action'=>'<controller>/<action>', 'prule'=>[ 'pvar'=>'param', 'class'=>'pathinfo',// 参数解析器类路径 // 'valueSplit'=>'/', // 'paramSplit'=>'/', // 所有参数的默认值以及顺序 'names'=>['id','status','type'], ] ]); // 或 Route::get('<controller:\w+>/<action:\w+>/thread<param:.*>','<controller>/<action>') ->asParamsRule([ 'pvar'=>'param', // 'valueSplit'=>'/', // 'paramSplit'=>'/', 'names'=>['id','status','type'] ]); // URL地址:news/get/id/122/status/1/type/1.html,$action::news/get,$params:["id"=>122,"status"=>1,"type"=>1] // URL地址:news/get/id/122/type/1.html,$action::news/get,$params:["id"=>122,"type"=>1] // URL地址:news/get/id/122/status/1.html,$action::news/get,$params:["id"=>122,"status"=>1] // 生成URL:["id"=>122,"status"=>1],得到的URL:xxx/id/122/status/1 // 生成URL:["id"=>122,"type"=>1,"status"=>1],得到的URL:xxx/id/122/status/1/type/1
Url地址生成
常规生成URL
use hehe\core\hrouter\RouteManager; use hehe\core\hrouter\Route; Route::get("news/add","news/doadd"); Route::get("news/<id:\d+>","news/get"); Route::get("news/search/conf<params:.*>","news/search") ->asOptions(["prule"=>["pvar"=>"param","class"=>'split','names'=>["catid"=>0,"status"=>0,] ]]); Route::get("<controller:\w+>/<action:\w+>","<controller>/<action>"); $hrouter = new RouteManager(); $url = $hrouter->buildUrL("news/doadd"); // $url:news/add $url = $hrouter->buildUrL("news/get",["id"=>1]); // $url:news/1 $url = $hrouter->buildUrL("news/list",["id"=>1]); // $url:news/list?id=1 $url = $hrouter->buildUrL("news/search",["catid"=>122,"status"=>1]); // $url:news/search/conf-122-1
由路由标识生成URL
use hehe\core\hrouter\RouteManager; use hehe\core\hrouter\Route; Route::get("news/<id:\d+>","news/get")->asId("news_id"); $hrouter = new RouteManager(); $url = $hrouter->buildUrL("news_id",["id"=>2]); // $url:news/2
生成带后缀URL
use hehe\core\hrouter\RouteManager; use hehe\core\hrouter\Route; Route::get("news/<id:\d+>","news/get")->asSuffix("html"); Route::get("news/list","news/get")->asSuffix(); $hrouter = new RouteManager(); $url = $hrouter->buildUrL("news/get",["id"=>2]); // $url:news/2.html $url = $hrouter->buildUrL("news/get.shtml",["id"=>2]); // $url:news/2.shtml $url = $hrouter->buildUrL("news/get",["id"=>2],["suffix"=>"shtml"]); // $url:news/2.shtml $url = $hrouter->buildUrL("news/list"); // $url:news/list.html $url = $hrouter->buildUrL("news/list",[],['suffix'=>"shtml"]); // $url:news/list.shtml
生成带域名URL
use hehe\core\hrouter\RouteManager; use hehe\core\hrouter\Route; Route::get("http://<language:[a-z]+>.xxx.com/user/get","news/get") ->asDefaults(["language"=>'ch']); $hrouter = new RouteManager(); $url = $hrouter->buildUrL("news/get"); // $url:http://ch.xxx.com/user/get
生成带锚点URL
use hehe\core\hrouter\RouteManager; $hrouter = new RouteManager(); $url = $hrouter->buildUrL("news/get",["#"=>"add"],['suffix'=>"html"]); // $url:news/get.html#add
restful路由
- 常规格式
use hehe\core\hrouter\Route; // 指定地址格式 Route::get("blog","blog/index"); Route::get("blog/create","blog/create"); Route::post("blog","blog/save"); Route::get("blog/<id:\d+>","blog/read"); Route::get("blog/<id:\d+>/edit","blog/edit"); Route::put("blog/<id:\d+>","blog/update"); Route::delete("blog/<id:\d+>","blog/delete");
- 变量格式
use hehe\core\hrouter\Route; // 通用格式 Route::get("<controller:\w+>","<controller>/index"); Route::get("<controller:\w+>/create","<controller>/create"); Route::post("<controller:\w+>","<controller>/save"); Route::get("<controller:\w+>/<id:\d+>","<controller>/read"); Route::get("<controller:\w+>/<id:\d+>/edit","<controller>/edit"); Route::put("<controller:\w+>/<id:\d+>","<controller>/update"); Route::delete("<controller:\w+>/<id:\d+>","<controller>/delete");
- 注解常规格式
namespace hrouter\tests\common; use hehe\core\hrouter\annotation\Restful; /** * @Restful("good") */ class GoodController { public function indexAction(){} public function createAction(){} public function saveAction(){} public function readAction(){} public function editAction(){} public function updateAction(){} public function deleteAction(){} }
- 注解变量格式
namespace hrouter\tests\common; use hehe\core\hrouter\annotation\Restful; /** * @Restful("<module:\w+>/order") */ class OrderController { public function indexAction(){} public function createAction(){} public function saveAction(){} public function readAction(){} public function editAction(){} public function updateAction(){} public function deleteAction(){} }
注解路由
- 说明
注解器:hehe\core\hrouter\annotation\Route
注解类:相当于创建一个分组路由,注解类方法相当于在分组路由注册子路由
- 注解类
namespace hrouter\tests\common; use hehe\core\hrouter\annotation\Route; /** * @Route("admin") * 相当于:Route::addRoute("admin<route:.*?>","admin<route>"); */ class AdminController { // 访问此方法:"admin/save" public function saveAction(){} }
- 注解类方法
namespace hrouter\tests\common; use hehe\core\hrouter\annotation\Route; #[Route("admin")] class AdminController { /** * @Route("doadd") * 相当于:Route::addRoute("admin/doadd","admin/add"); */ public function addAction(){} /** * 相当于:Route::addRoute("admin/<id:\d+>","admin/get")->asSuffix("html"); */ #[Route("/admin/<id:\d+>",suffix:"html")] public function getAction(){} /** * * 相当于:Route::addRoute("/admin/dosave","admin/save"); */ #[Route("/admin/save")] public function saveAction(){} }