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+mysql 采用ajax技术的 省 市 地 3级联动无刷新菜单 源码
Dec 16 PHP
全世界最小的php网页木马一枚 附PHP木马的防范方法
Oct 09 PHP
解析php5配置使用pdo
Jul 03 PHP
php的$_FILES的临时储存文件与回收机制实测过程
Jul 12 PHP
php递归方法实现无限分类实例代码
Feb 28 PHP
php强制用户转向www域名的方法
Jun 19 PHP
php+ajax 实现输入读取数据库显示匹配信息
Oct 08 PHP
php mysql_list_dbs()函数用法示例
Mar 29 PHP
PHP实践教程之过滤、验证、转义与密码详解
Jul 24 PHP
laravel 5异常错误:FatalErrorException in Handler.php line 38的解决
Oct 12 PHP
CMSPRESS 10行代码搞定 PHP无限级分类2
Mar 30 PHP
thinkPHP+LayUI 流加载实现功能
Sep 27 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
通过html表格发电子邮件
2006/10/09 PHP
用php随机生成福彩双色球号码的2种方法
2013/02/04 PHP
php读取富文本的时p标签会出现红线是怎么回事
2014/05/13 PHP
PHP性能分析工具XHProf安装使用教程
2015/05/13 PHP
PHP中ajax无刷新上传图片与图片下载功能
2017/02/21 PHP
ext for eclipse插件安装方法
2008/04/27 Javascript
jQuery处理xml格式的返回数据(实例解析)
2013/11/28 Javascript
Jquery获取元素的父容器对象示例代码
2014/02/10 Javascript
JS+CSS实现简单的二级下拉导航菜单效果
2015/09/21 Javascript
Bootstrap每天必学之进度条
2015/11/30 Javascript
全面解析Bootstrap布局组件应用
2016/02/22 Javascript
vue2.0在没有dev-server.js下的本地数据配置方法
2018/02/23 Javascript
详解关于表格合并span-method方法的补充(表格数据由后台动态返回)
2019/05/21 Javascript
vue实现图片预览组件封装与使用
2019/07/13 Javascript
微信小程序之左右布局的实现代码
2019/12/13 Javascript
Vue+Vuex实现自动登录的知识点详解
2020/03/04 Javascript
JavaScript图片旋转效果实现方法详解
2020/06/28 Javascript
[01:25:09]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第二场
2014/05/24 DOTA
[00:17]DOTA2荣耀之路5:It’s a disastah!
2018/05/28 DOTA
在Python下进行UDP网络编程的教程
2015/04/29 Python
使用 Visual Studio Code(VSCode)搭建简单的Python+Django开发环境的方法步骤
2018/12/17 Python
Python类的动态绑定实现原理
2020/03/21 Python
浅谈keras使用中val_acc和acc值不同步的思考
2020/06/18 Python
html5简介及新增功能介绍
2020/05/18 HTML / CSS
携程旅行网:中国领先的在线旅行服务公司
2017/02/17 全球购物
英国顶级水晶珠宝零售商之一:Tresor Paris
2019/04/27 全球购物
Lookfantastic意大利官网:英国知名美妆购物网站
2019/05/31 全球购物
路德维希•贝克(LUDWIG BECK)中文官网:德国大型美妆百货
2020/09/19 全球购物
单位单身证明范本
2014/01/11 职场文书
授权委托书格式模板
2014/04/03 职场文书
本科毕业生求职信
2014/06/15 职场文书
小学校园广播稿集锦
2014/10/04 职场文书
2015年销售工作总结范文
2015/03/30 职场文书
单位领导婚礼致辞
2015/07/28 职场文书
python 使用Tensorflow训练BP神经网络实现鸢尾花分类
2021/05/12 Python
多台电脑共享文件怎么设置?多台电脑共享文件操作教程
2022/04/08 数码科技