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 相关文章推荐
BBS(php &amp; mysql)完整版(六)
Oct 09 PHP
php adodb操作mysql数据库
Mar 19 PHP
Ajax PHP 边学边练 之三 数据库
Nov 26 PHP
PHP通用检测函数集合
Feb 08 PHP
php简单对象与数组的转换函数代码(php多层数组和对象的转换)
May 18 PHP
PHP APC配置文件2套和参数详解
Jun 11 PHP
PHP常用正则表达式集锦
Aug 17 PHP
Android App中DrawerLayout抽屉效果的菜单编写实例
Mar 21 PHP
thinkPHP5 tablib标签库自定义方法详解
May 10 PHP
PHP+Apache环境中如何隐藏Apache版本
Nov 24 PHP
php+Ajax处理xml与json格式数据的方法示例
Mar 04 PHP
在 Laravel 6 中缓存数据库查询结果的方法
Dec 11 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
zf框架db类的分页示例分享
2014/03/14 PHP
php开启openssl的方法
2014/05/15 PHP
使用PHP免费发送定时短信的实例
2016/10/24 PHP
Laravel 将数据表的数据导出,并生成seeds种子文件的方法
2019/10/09 PHP
YII2框架中日志的配置与使用方法实例分析
2020/03/18 PHP
php生成短网址/短链接原理和用法实例分析
2020/05/29 PHP
js加解密 脚本解密
2008/02/22 Javascript
jQuery文本框(input textare)事件绑定方法教程
2013/04/24 Javascript
jquery实现的动态回到顶部特效代码
2015/10/28 Javascript
jQuery插件FusionCharts绘制的2D双柱状图效果示例【附demo源码】
2017/05/13 jQuery
webpack 单独打包指定JS文件的方法
2018/02/22 Javascript
react中实现搜索结果中关键词高亮显示
2018/07/31 Javascript
Layui表格行工具事件与数据回填方法
2019/09/13 Javascript
Vue数字输入框组件的使用方法
2019/10/19 Javascript
[02:34]DOTA2英雄基础教程 幽鬼
2014/01/02 DOTA
TensorFlow 滑动平均的示例代码
2018/06/19 Python
Python闭包和装饰器用法实例详解
2019/05/22 Python
pandas factorize实现将字符串特征转化为数字特征
2019/12/19 Python
对django 2.x版本中models.ForeignKey()外键说明介绍
2020/03/30 Python
python3 配置logging日志类的操作
2020/04/08 Python
国际知名设计师时装商店:Coggles
2016/09/05 全球购物
Otticanet英国:最顶尖的世界名牌眼镜, 能得到打折季的价格
2019/02/10 全球购物
澳大利亚在线购买葡萄酒:The Wine Collective
2020/02/20 全球购物
运行时异常与一般异常有何异同?
2014/01/05 面试题
西部世纪.net笔试题面试题
2014/04/03 面试题
建筑结构施工专业推荐信
2014/02/21 职场文书
幼儿园元旦家长感言
2014/02/27 职场文书
食品安全工作方案
2014/05/07 职场文书
2015关爱留守儿童工作总结
2014/12/12 职场文书
模范班主任事迹材料
2014/12/17 职场文书
工商局个人工作总结
2015/03/03 职场文书
2015年小学数学教师个人工作总结
2015/05/25 职场文书
李强为自己工作观后感
2015/06/11 职场文书
课程设计感想范文
2015/08/11 职场文书
2016年社区国庆节活动总结
2016/04/01 职场文书
Java实战之用Swing实现通讯录管理系统
2021/06/13 Java/Android