复制代码 代码如下:
<?php
class Router {
// 路由表
private $routers = array(
array("name"=>"userlist", "pattern"=>"get /user", "action"=>"User#get"),
array("name"=>"userinfo", "pattern"=>"get /user/:s", "action"=>"User#getById"),
array("name"=>"useradd", "pattern"=>"post /user", "action"=>"User#add"),
array("name"=>"userupdate", "pattern"=>"update /user", "action"=>"User#update"),
array("name"=>"userdel", "pattern"=>"delete /user/:id", "action"=>"User#delete")
);
// 入口
public function dispatch() {
$url = $_SERVER["REQUEST_URI"];
$method = $_SERVER["REQUEST_METHOD"];
foreach ($this->routers as $router) {
$pattern = $router["pattern"];
$pats = explode(" ", $pattern);
if (strcasecmp($pats[0], $method) == 0) {
// 是否与当前路由匹配
$params = $this->checkUrl($method, strtolower($url), strtolower($pats[1]));
if ($params != null) {
array_shift($params);
$action = $router["action"];
// 寻找到第一个匹配的路由即执行,然后返回
return $this->invoke($action, $params);
}
}
}
echo "404 error";
// error 404
}
private function invoke($action, $params) {
$acts = explode("#", $action);
$className = $acts[0]."Action";
$methodName = $acts[1];
$actionDir = dirname(__FILE__).DIRECTORY_SEPARATOR."action";
// 载入action文件
$classFile = $actionDir.DIRECTORY_SEPARATOR.$className.".php";
if (! file_exists($classFile)) {
// 404 error
echo "404 error, no action found";
return;
} else {
require "$classFile";
// 使用反射执行方法
$rc = new ReflectionClass($className);
if (! $rc->hasMethod($methodName)) {
// 404 error
echo "404 error, no method found";
return;
} else {
$instance = $rc->newInstance();
$method = $rc->getMethod($methodName);
$method->invokeArgs($instance, $params);
}
}
}
// 正则匹配检查,并提取出参数
private function checkUrl($method, $str, $pattern) {
//echo "check $str with $pattern <br>";
$ma = array();
$pattern = ltrim(rtrim($pattern, "/"));
$pattern = "/".str_replace("/", "\/", $pattern)."\/?$/";
$pattern = str_replace(":s", "([^\/]+)", $pattern);
//echo "pattern $pattern<br>";
//$str = "/\".$str."$/";
if (preg_match($pattern, $str, $ma) > 0) {
return $ma;
}
return null;
}
}
?>
php,restful,路由类
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
更新日志
- 金池VS刘罡2009《双声情》[WAV+CUE]
- 冯奥迪《卄》[320K/MP3][67.08MB]
- 冯奥迪《卄》[FLAC/分轨][172.46MB]
- Merryland《Merryland》[320K/MP3][69.48MB]
- 苏芮.1991-停在我心里的温柔【福茂】【WAV+CUE】
- 苏慧伦.2020-面面Every.Side.of.Me【相信音乐】【WAV+CUE】
- 群星.1991-不一样的感觉REMIX【宝丽金】【WAV+CUE】
- 银霞.1983-《你那好冷的小手》珍藏纪念版[WAV分轨]
- 银霞.2002-《国语巨星专辑VOL.3》2CD台湾版[WAV+CUE]
- 金池刘罡《昨日情歌HQ》头版限量编号[低速原抓WAV+CUE]
- 段奥娟.2024-23·岁碎念【白米范】【FLAC分轨】
- 顺子.2001-昨日·唯一·更多·顺子自选辑【魔岩】【WAV+CUE】
- 无印良品.1999-私藏三首·原创相对论(EP)【滚石】【WAV+CUE】
- Merryland《Merryland》[FLAC/分轨][170.22MB]
- 庄锭欣 ELKIE《没有你的未来》[320K/MP3][15.78MB]