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 相关文章推荐
PHP6 mysql连接方式说明
Feb 09 PHP
php安全之直接用$获取值而不$_GET 字符转义
Jun 03 PHP
php数据类型判断函数有哪些
Sep 23 PHP
php中AES加密解密的例子小结
Feb 18 PHP
php使用正则表达式提取字符串中尖括号、小括号、中括号、大括号中的字符串
Apr 05 PHP
VPS中使用LNMP安装WordPress教程
Dec 28 PHP
thinkphp3.x中cookie方法的用法分析
May 19 PHP
php flush无效,IIS7下php实时输出的方法
Aug 25 PHP
PHP __call()方法实现委托示例
May 20 PHP
laravel 时间格式转时间戳的例子
Oct 11 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
Feb 18 PHP
php中array_fill函数的实例用法
Mar 02 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调用mysql存储过程
2007/02/14 PHP
php表单转换textarea换行符的方法
2010/09/10 PHP
php中文乱码怎么办如何让浏览器自动识别utf-8
2014/01/15 PHP
destoon实现底部添加你是第几位访问者的方法
2014/07/15 PHP
php中socket的用法详解
2014/10/24 PHP
php把字符串指定字符分割成数组的方法
2018/03/12 PHP
常见浏览器多长时间会提示“脚本运行时间过长”总结
2014/04/29 Javascript
Node.js中创建和管理外部进程详解
2014/08/16 Javascript
5种处理js跨域问题方法汇总
2014/12/04 Javascript
JQuery显示、隐藏div的几种方法简明总结
2015/04/16 Javascript
jQuery实现带有动画效果的回到顶部和底部代码
2015/11/04 Javascript
jQuery中的siblings用法实例分析
2015/12/24 Javascript
JavaScript实现格式化字符串函数String.format
2016/12/16 Javascript
js鼠标经过tab选项卡时实现切换延迟
2017/03/24 Javascript
vuejs绑定class和style样式
2017/04/11 Javascript
JavaScript数据结构之广义表的定义与表示方法详解
2017/04/12 Javascript
Node.js对MongoDB数据库实现模糊查询的方法
2017/05/03 Javascript
[js高手之路]HTML标签解释成DOM节点的实现方法
2017/08/31 Javascript
vue interceptor 使用教程实例详解
2018/09/13 Javascript
vue中keep-alive组件的入门使用教程
2019/06/06 Javascript
[01:11:27]2018DOTA2亚洲邀请赛小组赛 A组加赛 Newbee vs Optic
2018/04/03 DOTA
web.py中调用文件夹内模板的方法
2014/08/26 Python
Python脚本实现网卡流量监控
2015/02/14 Python
python获取当前时间对应unix时间戳的方法
2015/05/15 Python
django之静态文件 django 2.0 在网页中显示图片的例子
2019/07/28 Python
Python迭代器iterator生成器generator使用解析
2019/10/24 Python
Django异步任务线程池实现原理
2019/12/17 Python
python tqdm实现进度条的示例代码
2020/11/10 Python
自我评价范文分享
2014/01/04 职场文书
《记金华的双龙洞》教学反思
2014/04/19 职场文书
俞敏洪北大演讲稿
2014/05/22 职场文书
乡镇三严三实学习心得体会
2014/10/13 职场文书
物价局领导班子四风问题整改措施
2014/10/26 职场文书
2014年销售工作总结范文
2014/12/01 职场文书
高中开学感言
2015/08/01 职场文书
MySQL系列之八 MySQL服务器变量
2021/07/02 MySQL