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数组函数序列之each() - 获取数组当前内部指针所指向元素的键名和键值,并将指针移到下一位
Oct 31 PHP
PHP 常用数组内部函数(Array Functions)介绍
Jun 05 PHP
详解PHP中的状态模式编程
Aug 11 PHP
PHP图片加水印实现方法
May 06 PHP
php中让人头疼的浮点数运算分析
Oct 10 PHP
PHP在线打包下载功能示例
Oct 15 PHP
PHP链表操作简单示例
Oct 15 PHP
Zend Framework动作控制器用法示例
Dec 09 PHP
php常用字符函数实例小结
Dec 29 PHP
Laravel5.* 打印出执行的sql语句的方法
Jul 24 PHP
关于php开启错误提示的总结
Sep 24 PHP
基于Laravel 多个中间件的执行顺序详解
Oct 21 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 配置文件中open_basedir选项作用
2009/07/19 PHP
CodeIgniter自定义控制器MY_Controller用法分析
2016/01/20 PHP
详解PHP PDO简单教程
2019/05/28 PHP
javascript在一段文字中的光标处插入其他文字
2007/08/26 Javascript
JS写的贪吃蛇游戏(个人练习)
2013/07/08 Javascript
论Bootstrap3和Foundation5网格系统的异同
2016/05/16 Javascript
JavaScript知识点总结(五)之Javascript中两个等于号(==)和三个等于号(===)的区别
2016/05/31 Javascript
jQuery Chart图表制作组件Highcharts用法详解
2016/06/01 Javascript
jQuery实现iframe父窗体和子窗体的相互调用
2016/06/17 Javascript
canvas实现流星雨的背景效果
2017/01/13 Javascript
jQuery实现的浮动层div浏览器居中显示效果
2017/02/03 Javascript
微信小程序 ecshop地址三级联动实现实例代码
2017/02/28 Javascript
angularjs实现分页和搜索功能
2018/01/03 Javascript
全新打包工具parcel零配置vue开发脚手架
2018/01/11 Javascript
基于JavaScript实现抽奖系统
2018/01/16 Javascript
mac上配置Android环境变量的方法
2018/07/08 Javascript
angularJS1 url中携带参数的获取方法
2018/10/09 Javascript
详解Axios 如何取消已发送的请求
2018/10/20 Javascript
python实现爬虫统计学校BBS男女比例之数据处理(三)
2015/12/31 Python
python函数中return后的语句一定不会执行吗?
2017/07/06 Python
Python用csv写入文件_消除空余行的方法
2018/07/06 Python
Python装饰器使用你可能不知道的几种姿势
2019/10/25 Python
python opencv进行图像拼接
2020/03/27 Python
CSS3下的渐变文字效果实现示例
2018/03/02 HTML / CSS
使用css如何制作时间ICON方法实践
2012/11/12 HTML / CSS
HTML5 textarea高度自适应的两种方案
2020/04/08 HTML / CSS
工商管理专业实习大学生自我鉴定
2013/09/19 职场文书
体育教育毕业生自荐信
2013/11/21 职场文书
中专毕业生自荐信范文
2013/11/28 职场文书
大学生的四年学习自我评价
2013/12/13 职场文书
《穷人》教学反思
2014/04/08 职场文书
2014年乡镇妇联工作总结
2014/12/02 职场文书
教师正风肃纪心得体会
2016/01/15 职场文书
《法国号》教学反思
2016/02/22 职场文书
《中国古代诗歌散文欣赏》高中语文教材
2019/08/20 职场文书
CSS3 制作精美的定价表
2021/04/06 HTML / CSS