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中支持多种编码的中文字符串截取函数!
Mar 20 PHP
php 验证码制作(网树注释思想)
Jul 20 PHP
PHP数组交集的优化代码分析
Mar 06 PHP
php流量统计功能的实现代码
Sep 29 PHP
php对数组排序的简单实例
Dec 25 PHP
PHP生成随机数的方法实例分析
Jan 22 PHP
教你在PHPStorm中配置Xdebug
Jul 27 PHP
十个PHP高级应用技巧果断收藏
Sep 25 PHP
php 判断字符串编码是utf-8 或gb2312实例
Nov 01 PHP
php自定义函数br2nl实现将html中br换行符转换为文本输入中换行符的方法【与函数nl2br功能相反】
Feb 17 PHP
如何修改Laravel中url()函数生成URL的根地址
Aug 11 PHP
PHP获取当前时间不准确问题解决方案
Aug 14 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中使用正则表达式进行查找替换
2013/06/13 PHP
php使用fgetcsv读取csv文件出现乱码的解决方法
2014/11/08 PHP
JQuery 1.3.2以上版本中出现pareseerror错误的解决方法
2011/01/11 Javascript
事件委托与阻止冒泡阻止其父元素事件触发
2014/09/02 Javascript
JavaScript使用slice函数获取数组部分元素的方法
2015/04/06 Javascript
第六篇Bootstrap表格样式介绍
2016/06/21 Javascript
Angular设置title信息解决SEO方面存在问题
2016/08/19 Javascript
Bootstrap源码解读导航(6)
2016/12/23 Javascript
js获取当前页的URL与window.location.href简单方法
2017/02/13 Javascript
原生JS京东轮播图代码
2017/03/22 Javascript
jQuery动态追加页面数据以及事件委托详解
2017/05/06 jQuery
微信小程序多张图片上传功能
2017/06/07 Javascript
react native基于FlatList下拉刷新上拉加载实现代码示例
2018/09/30 Javascript
js控制随机数生成概率代码实例
2019/03/21 Javascript
vue+vuex+json-seiver实现数据展示+分页功能
2019/04/11 Javascript
《javascript设计模式》学习笔记七:Javascript面向对象程序设计组合模式详解
2020/04/08 Javascript
[01:08:10]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS LGD-CDEC
2014/05/22 DOTA
[01:45]DOTA2新英雄“神谕者”全方位展示
2014/11/21 DOTA
布同自制Python函数帮助查询小工具
2011/03/13 Python
Python判断操作系统类型代码分享
2014/11/22 Python
python Flask实现restful api service
2017/12/04 Python
PyQt5 pyqt多线程操作入门
2018/05/05 Python
详解python的sorted函数对字典按key排序和按value排序
2018/08/10 Python
基于python实现KNN分类算法
2020/04/23 Python
python 正则表达式参数替换实例详解
2020/01/17 Python
浅谈python输出列表元素的所有排列形式
2020/02/26 Python
【HTML5】Canvas绘制简单图片教程
2016/05/13 HTML / CSS
阿里巴巴Oracle DBA笔试题答案-备份恢复类
2013/11/20 面试题
公证委托书大全
2014/04/04 职场文书
语文高效课堂实施方案
2014/05/03 职场文书
环保倡议书400字
2014/05/15 职场文书
小学德育工作经验交流材料
2014/05/22 职场文书
投标诚信承诺书
2014/05/26 职场文书
2015年乡镇平安建设工作总结
2015/05/13 职场文书
教师远程研修感悟
2015/11/18 职场文书
企业愿景口号
2015/12/25 职场文书