php处理restful请求的路由(转载 http://www.jb51.net/article/47333.htm)
<?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请求的路由(转载 http://www.jb51.net/article/47333.htm)的更多相关文章
- linux上传下载文件(转载https://www.jb51.net/article/143112.htm)
转载于:https://www.jb51.net/article/143112.htmLinux下目录复制:本机->远程服务器 1 scp -r /home/shaoxiaohu/test1 z ...
- PHP5各个版本的新功能和新特性总结(转载 http://www.jb51.net/article/48150.htm)
本文目录:PHP5.2 以前:autoload, PDO 和 MySQLi, 类型约束PHP5.2:JSON 支持PHP5.3:弃用的功能,匿名函数,新增魔术方法,命名空间,后期静态绑定,Heredo ...
- jquery sortable的拖动方法内容说明和示例详解(转载http://www.jb51.net/article/45803.htm)
所有的事件回调函数都有两个参数:event和ui,浏览器自有event对象,和经过封装的ui对象 ui.helper - 表示sortable元素的JQuery对象,通常是当前元素的克隆对象 u ...
- <转载> MySQL 性能优化的最佳20多条经验分享 http://www.jb51.net/article/24392.htm
当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能.这里,我们不会讲过多的SQL语句的优化,而只是针对MySQL这一Web应用最多的数据库.希望下面的这 ...
- <转载>ant使用指南详细入门教程 http://www.jb51.net/article/67041.htm
这篇文章主要介绍了ant使用指南详细入门教程,本文详细的讲解了安装.验证安装.使用方法.使用实例.ant命令等内容,需要的朋友可以参考下 一.概述 ant 是一个将软件编译.测试.部署等步骤联系在一起 ...
- Spring-cloud(五) 使用Ribbon进行Restful请求
写在前面 本文由markdown格式写成,为本人第一次这么写,排版可能会有点乱,还望各位海涵. 主要写的是使用Ribbon进行Restful请求,测试各个方法的使用,代码冗余较高,比较适合初学者,介意 ...
- 技术分享 | 一步一步学测试平台开发-Vue restful请求
本文节选自霍格沃兹测试学院内部教材 一般在构建应用时需要访问后端的 API 接口获取后端数据并展示.做这件事的方法有很多种(比如 axios,vue-resource,fetch-jsonp),使用 ...
- jquery 异步请求Demo【转载】
$(document).ready(function() { $.ajax({ url : "/AjaxAction/LoginArea.ashx", data : {userna ...
- jhipster生成项目无法使用restful请求,报access_denied 403错误
写在前边: 我们的微服务是注册中心.uaa.gateway为基础,添加微服务应用,昨天下午在测试jhipster的增删改查,因为jhipster生成的代码都是restful的,好不容易找到网关配置的映 ...
随机推荐
- mysql -- 创建存储过程 往数据表中新增字段
需求: 往某数据库的某个表中新增一个字段(若该字段已存在,则不做操作:若该字段不存在,则新增) 百度了n久,没有符合要求的例子,只有参考加自己琢磨,最终终于给弄出来了,以下是几个版本的更迭 第一版: ...
- yii2.0操作数据库
首先不得不说yii2.0面向对象的比较彻底,建议没学过或者没学好面向对象的同学再看看面向对象. 其次切入正题. 先创建数据库,这步自己写. DROP TABLE IF EXISTS `country` ...
- windows 10 搭建go环境
1. 到 https://golang.org/ 下载go 的msi安装包.安装后 GOROOT 已经自动帮你设置好. 2.设置GOPATH 不能跟 GOROOT 同一个目录.到系统环境变量里新增一个 ...
- AWS系列-添加购买的https证书
1.1 自行购买证书 1.2 上传证书 打开EC2的负载均衡 选择相应的ALB 添加侦听器 选择https 端口443 选择目标组 证书类型 上传证书到IAM 证书名称填写申请证书时候的那个域名 私有 ...
- Echarts中axislabel文字过长导致显示不全或重叠
最近在使用Echarts的时候,遇到点问题就是xAxis文字过长导致x轴的文字显示不全. 解决方案如下: 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HT ...
- Visual Studio Code 配置 gulp
原本用的webstorm部署的gulp,后来由于太卡,打算换个编辑器,考虑了一番,之前用的是sublime,配置很是麻烦,最新听说饥人谷老师用的是vsCode,所以打算尝试一下这个编辑器,安装还是很方 ...
- <span>和<div>标签的隐藏和显示切换
<div class="axb"> <span id="tipStep1" class="fl" >第一步显示< ...
- 160530、memcached集群(spring集成的配置)
第一步:在linux机或windows机上安装memcached服务端(server) linux中安装memcached:centos中命令 yum -y install memcached 如果没 ...
- 原生封装的ajax
原生封装的ajax的代码如下: //将数据转换成 a=1&b=2格式; function json2url(json){ var arr = []; //加随机数防止缓存; json.t = ...
- web测试点--摘录
转载地址:Web测试到底是在测什么 一.输入框 1.字符型输入框: (1)字符型输入框:英文全角.英文半角.数字.空或者空格.特殊字符“~!@#¥%……&*?[]{}”特别要注意单引号和&am ...