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 模板高级篇总结
Dec 21 PHP
php实现的仿阿里巴巴实现同类产品翻页
Dec 11 PHP
PHP表单验证的3个函数ISSET()、empty()、is_numeric()的使用方法
Aug 22 PHP
php保存信息到当前Session的方法
Mar 16 PHP
解决更换PHP5.4以上版本后Dedecms后台登录空白问题的方法
Oct 23 PHP
Thinkphp3.2.3分页使用实例解析
Jul 28 PHP
php利用递归实现删除文件目录的方法
Sep 23 PHP
php微信开发之音乐回复功能
Jun 14 PHP
Yii1.1框架实现PHP极光推送消息通知功能
Sep 06 PHP
PHP实现对数字分隔加千分号的方法
Mar 18 PHP
PHP中的自动加载操作实现方法详解
Aug 06 PHP
laravel csrf排除路由,禁止,关闭指定路由的例子
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+FFMPEG实现将视频自动转码成H264标准Mp4文件
2014/09/24 PHP
php读取csv数据保存到数组的方法
2015/01/03 PHP
PHP获取Exif缩略图的方法
2015/07/13 PHP
fsockopen pfsockopen函数被禁用,SMTP发送邮件不正常的解决方法
2015/09/20 PHP
基于Codeigniter框架实现的student信息系统站点动态发布功能详解
2017/03/23 PHP
php将html转为图片的实现方法
2017/05/19 PHP
Ajax请求PHP后台接口返回信息的实例代码
2018/08/21 PHP
学习jquery之一
2007/04/27 Javascript
js 设置选中行的样式的实现代码
2010/05/24 Javascript
利用NodeJS的子进程(child_process)调用系统命令的方法分享
2013/06/05 NodeJs
javascript获取select值的方法分析
2015/07/02 Javascript
jQuery Mobile和HTML5开发App推广注册页
2016/11/07 Javascript
禁用backspace网页回退功能的实现代码
2016/11/15 Javascript
JS小数转换为整数的方法分析
2017/01/07 Javascript
ES6新特性之模块Module用法详解
2017/04/01 Javascript
Angular2自定义分页组件
2017/04/19 Javascript
js实现带进度条提示的多视频上传功能
2020/12/13 Javascript
JavaScript中concat复制数组方法浅析
2019/01/20 Javascript
Python标准库urllib2的一些使用细节总结
2015/03/16 Python
python数组复制拷贝的实现方法
2015/06/09 Python
python去除空格和换行符的实现方法(推荐)
2017/01/04 Python
python爬虫_微信公众号推送信息爬取的实例
2017/10/23 Python
Django数据库表反向生成实例解析
2018/02/06 Python
使用Python计算玩彩票赢钱概率
2019/06/26 Python
flask框架单元测试原理与用法实例分析
2019/07/23 Python
Python面向对象之Web静态服务器
2019/09/03 Python
python golang中grpc 使用示例代码详解
2020/06/03 Python
摄影实习自我鉴定
2013/09/20 职场文书
给护士表扬信
2014/01/19 职场文书
单身联谊活动方案
2014/01/29 职场文书
公职人员索取回扣检举信
2014/04/04 职场文书
外联部演讲稿
2014/05/24 职场文书
接触艺术对孩子学习思维有益
2019/08/06 职场文书
MySQL学习总结-基础架构概述
2021/04/05 MySQL
Java实现斗地主之洗牌发牌
2021/06/14 Java/Android
Win Server2016远程桌面如何允许多用户同时登录
2022/06/10 Servers