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安装问题
Oct 09 PHP
我的群发邮件程序
Oct 09 PHP
PHP父类调用子类方法的代码例子
Apr 09 PHP
CI框架开发新浪微博登录接口源码完整版
May 28 PHP
CI框架中通过hook的方式实现简单的权限控制
Jan 07 PHP
PHP封装的Twitter访问类实例
Jul 18 PHP
php检测文本的编码
Jul 26 PHP
培养自己的php编码规范
Sep 28 PHP
解决PHP里大量数据循环时内存耗尽的方法
Oct 10 PHP
PHPCMS2008广告模板SQL注入漏洞修复
Oct 11 PHP
php中各种定义变量的方法小结
Oct 18 PHP
php提取微信账单的有效信息
Oct 01 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
Linux操作系统安装LAMP环境
2015/06/26 PHP
javascript的函数
2007/01/31 Javascript
向大师们学习Javascript(视频与PPT)
2009/12/27 Javascript
EditPlus注册码生成器(js代码实现)
2013/03/25 Javascript
JavaScript 学习笔记之变量及其作用域
2015/01/14 Javascript
JS简单计算器实例
2015/01/20 Javascript
JavaScript自定义等待wait函数实例分析
2015/03/23 Javascript
JavaScript中字符串拼接的基本方法
2015/07/07 Javascript
JS判断当前页面是否在微信浏览器打开的方法
2015/12/08 Javascript
AngularJS实现表单手动验证和表单自动验证
2015/12/09 Javascript
Jquery技巧(必须掌握)
2016/03/16 Javascript
自学实现angularjs依赖注入
2016/12/20 Javascript
微信小程序 跳转方式总结
2017/04/20 Javascript
node.js中EJS 模板快速入门教程
2017/05/08 Javascript
JS路由跳转的简单实现代码
2017/09/21 Javascript
使用JS获取SessionStorage的值
2018/01/12 Javascript
手把手教你如何使用nodejs编写cli命令行
2018/11/05 NodeJs
elementUI中Table表格问题的解决方法
2018/12/04 Javascript
js常见遍历操作小结
2019/06/06 Javascript
python根据距离和时长计算配速示例
2014/02/16 Python
Python使用MySQLdb for Python操作数据库教程
2014/10/11 Python
Python实现Kmeans聚类算法
2020/06/10 Python
python中append实例用法总结
2019/07/30 Python
Python中PyQt5/PySide2的按钮控件使用实例
2019/08/17 Python
python3实现微型的web服务器
2019/09/03 Python
Python爬虫进阶之爬取某视频并下载的实现
2020/12/08 Python
PyQt5通过信号实现MVC的示例
2021/02/06 Python
Dr. Martens马汀博士官网:马丁靴始祖品牌
2016/10/15 全球购物
微软美国官方网站:Microsoft美国
2018/05/10 全球购物
哄娃神器4moms商店:美国婴童用品品牌
2019/03/07 全球购物
SEPHORA丝芙兰德国官方购物网站:化妆品、护肤品和香水
2020/01/21 全球购物
总经理助理岗位职责
2013/11/08 职场文书
五年级音乐教学反思
2014/02/06 职场文书
元旦寄语大全
2014/04/10 职场文书
期中考试后的感想
2015/08/07 职场文书
python高温预警数据获取实例
2022/07/23 Python