加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php处理restful请求的路由类分享

发布时间:2020-12-12 20:04:44 所属栏目: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","patt

代码如下:
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
";
$ma = array();
$pattern = ltrim(rtrim($pattern,"/"));
$pattern = "/".str_replace("/","/",$pattern)."/?$/";
$pattern = str_replace(":s","([^/]+)",$pattern);
//echo "pattern $pattern
";
//$str = "/".$str."$/";
if (preg_match($pattern,$ma) > 0) {
return $ma;
}
return null;
}
}
?>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读