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


Posted in PHP onFebruary 27, 2014
<?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 相关文章推荐
用PHP读取RSS feed的代码
Aug 01 PHP
PHP下一个非常全面获取图象信息的函数
Nov 20 PHP
Ajax+PHP边学边练 之五 图片处理
Dec 03 PHP
深入分析php中接口与抽象类的区别
Jun 08 PHP
php下载文件源代码(强制任意文件格式下载)
May 09 PHP
PHP获取MySql新增记录ID值的3种方法
Jun 24 PHP
PHP return语句的另一个作用
Jul 30 PHP
php如何获取文件的扩展名
Oct 28 PHP
详解PHP的Yii框架中日志的相关配置及使用
Dec 08 PHP
Laravel-admin之修改操作日志的方法
Sep 30 PHP
Laravel 错误提示本地化的实现
Oct 22 PHP
PHP 面向对象程序设计之类属性与类常量实现方法分析
Apr 13 PHP
php中session退出登陆问题
Feb 27 #PHP
php的ajax简单实例
Feb 27 #PHP
php中require和require_once的区别说明
Feb 27 #PHP
php更新修改excel中的内容实例代码
Feb 26 #PHP
php获取文件大小的方法
Feb 26 #PHP
PHP批量上传图片的具体实现方法介绍.
Feb 26 #PHP
php把session写入数据库示例
Feb 26 #PHP
You might like
php简单封装了一些常用JS操作
2007/02/25 PHP
推荐Discuz!5的PHP代码高亮显示与实现可运行代码
2007/03/15 PHP
深入PHP数据缓存的使用说明
2013/05/10 PHP
WordPress中获取页面链接和标题的相关PHP函数用法解析
2015/12/17 PHP
Yii框架通过请求组件处理get,post请求的方法分析
2019/09/03 PHP
JS跨域总结
2012/08/30 Javascript
js弹出层(jQuery插件形式附带reLoad功能)
2013/04/12 Javascript
JQuery表格拖动调整列宽效果(自己动手写的)
2014/09/01 Javascript
一个JavaScript处理textarea中的字符成每一行实例
2014/09/22 Javascript
JavaScript检测浏览器cookie是否已经启动的方法
2015/02/27 Javascript
jQuery原理系列-css选择器的简单实现
2016/06/07 Javascript
利用纯Vue.js构建Bootstrap组件
2016/11/03 Javascript
Vue.js常用指令汇总(v-if、v-for等)
2016/11/03 Javascript
jQuery无缝轮播图代码
2016/12/22 Javascript
详谈js中window.location.search的用法和作用
2017/02/13 Javascript
canvas压缩图片转换成base64格式输出文件流
2017/03/09 Javascript
解决Mac node版本升级失败的问题
2018/05/16 Javascript
uni-app从安装到卸载的入门教程
2020/05/15 Javascript
[43:26]完美世界DOTA2联赛PWL S2 Forest vs Rebirth 第二场 11.20
2020/11/23 DOTA
Python实现批量下载文件
2015/05/17 Python
python3 与python2 异常处理的区别与联系
2016/06/19 Python
Python切换pip安装源的方法详解
2016/11/18 Python
详解Python3 基本数据类型
2019/04/19 Python
python requests使用socks5的例子
2019/07/25 Python
Python之time模块的时间戳,时间字符串格式化与转换方法(13位时间戳)
2019/08/12 Python
解决pymysql cursor.fetchall() 获取不到数据的问题
2020/05/15 Python
TensorFlow保存TensorBoard图像操作
2020/06/23 Python
Python matplotlib图例放在外侧保存时显示不完整问题解决
2020/07/28 Python
创业计划书的写作技巧及要点
2014/01/31 职场文书
亲属关系公证书
2014/04/08 职场文书
2014年秋季开学典礼主持词
2014/08/02 职场文书
2014学校领导四风对照检查材料思想汇报
2014/09/23 职场文书
个人自查自纠材料
2014/10/14 职场文书
目标责任书格式范文
2015/05/11 职场文书
2015入党个人自传范文
2015/06/26 职场文书
Django利用AJAX技术实现博文实时搜索
2021/05/06 Python