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 分库分表hash算法
Nov 12 PHP
PHP屏蔽蜘蛛访问代码及常用搜索引擎的HTTP_USER_AGENT
Mar 06 PHP
深入Apache与Nginx的优缺点比较详解
Jun 17 PHP
解析php类的注册与自动加载
Jul 05 PHP
php和jquery实现地图区域数据统计展示数据示例
Feb 12 PHP
详解Grunt插件之LiveReload实现页面自动刷新(两种方案)
Jul 31 PHP
详解PHP中的序列化、反序列化操作
Mar 21 PHP
ThinkPHP模板标签eq if 中区分0,null,false的方法
Mar 24 PHP
yii2局部关闭(开启)csrf的验证的实例代码
Jul 10 PHP
laravel 框架结合关联查询 when()用法分析
Nov 22 PHP
PHP $O00OO0=urldecode &amp; eval 解密,记一次商业源码的去后门
Sep 13 PHP
PHP中国际化的字符串排序和比较对象详解
Aug 23 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判断电脑访问、手机访问的例子
2014/05/10 PHP
Codeigniter的一些优秀特性总结
2015/01/21 PHP
PHP框架Laravel的小技巧两则
2015/02/10 PHP
PHP中register_shutdown_function函数的基础介绍与用法详解
2017/11/28 PHP
jQuery 1.5 源码解读 面向中高阶JSER
2011/04/05 Javascript
jQuery 绑定事件到动态创建的元素上的方法实例
2013/08/18 Javascript
详解JavaScript编程中正则表达式的使用
2015/10/25 Javascript
微信小程序实战之自定义模态弹窗(8)
2017/04/18 Javascript
VUE axios上传图片到七牛的实例代码
2017/07/28 Javascript
AngularJS 中ui-view传参的实例详解
2017/08/25 Javascript
详解webpack编译速度提升之DllPlugin
2019/02/05 Javascript
如何通过setTimeout理解JS运行机制详解
2019/03/23 Javascript
wx-charts 微信小程序图表插件的具体使用
2019/08/18 Javascript
vue仿ios列表左划删除
2019/09/26 Javascript
写给新手同学的vuex快速上手指北小结
2020/04/14 Javascript
学前端,css与javascript重难点浅析
2020/06/11 Javascript
[01:33:59]真人秀《加油 DOTA》 第六期
2014/09/09 DOTA
Python的randrange()方法使用教程
2015/05/15 Python
基于Python中capitalize()与title()的区别详解
2017/12/09 Python
详解python3中zipfile模块用法
2018/06/18 Python
Python统计时间内的并发数代码实例
2019/12/28 Python
Django接收照片储存文件的实例代码
2020/03/07 Python
python如何解析复杂sql,实现数据库和表的提取的实例剖析
2020/05/15 Python
python selenium xpath定位操作
2020/09/01 Python
压铸汽车模型收藏家:Diecastmodelswholesale.com
2016/12/21 全球购物
GUESS德国官网:美国牛仔服装品牌
2017/02/14 全球购物
数字天堂软件测试面试题
2012/12/23 面试题
毕业生自我鉴定
2013/11/05 职场文书
企业精神口号
2014/06/11 职场文书
2014年居委会工作总结
2014/12/09 职场文书
高中生打架检讨书1000字
2015/02/17 职场文书
教学督导岗位职责
2015/04/10 职场文书
学校后勤工作总结2015
2015/05/15 职场文书
Pyhton模块和包相关知识总结
2021/05/12 Python
vue-cli3.x配置全局的scss的时候报错问题及解决
2022/04/30 Vue.js
MySQL数据库配置信息查看与修改方法详解
2022/06/25 MySQL