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的字符串用法小结
Jun 08 PHP
php中将数组存到文件里的实现代码
Jan 19 PHP
php笔记之:有规律大文件的读取与写入的分析
Apr 26 PHP
win7+apache+php+mysql环境配置操作详解
Jun 10 PHP
CodeIgniter安全相关设置汇总
Jul 03 PHP
php中字符集转换iconv函数使用总结
Oct 11 PHP
WordPress中设置Post Type自定义文章类型的实例教程
May 10 PHP
py文件转exe时包含paramiko模块出错解决方法
Aug 12 PHP
PHP使用PDO调用mssql存储过程的方法示例
Oct 07 PHP
thinkphp 中的volist标签在ajax操作中的特殊性(推荐)
Jan 15 PHP
ThinkPHP5 验证器的具体使用
May 31 PHP
PHP cookie与session会话基本用法实例分析
Nov 18 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
mysql5写入和读出乱码解决
2006/11/25 PHP
如何使用php判断服务器是否是HTTPS连接
2013/07/05 PHP
PHP SPL标准库中的常用函数介绍
2015/05/11 PHP
php 浮点数比较方法详解
2017/05/05 PHP
跨浏览器的 mouseenter mouseleave 以及 compareDocumentPosition的使用说明
2010/05/04 Javascript
jQuery学习基础知识小结
2010/11/25 Javascript
jquery创建一个新的节点对象(自定义结构/内容)的好方法
2013/01/21 Javascript
js中一维数组和二位数组中的几个问题示例说明
2014/07/17 Javascript
jQuery $.each遍历对象、数组用法实例
2015/04/16 Javascript
jQuery插件FusionCharts绘制ScrollColumn2D图效果示例【附demo源码下载】
2017/03/22 jQuery
详解angular2实现ng2-router 路由和嵌套路由
2017/03/24 Javascript
详解nodeJS之路径PATH模块
2017/05/31 NodeJs
vue中遇到的坑之变化检测问题(数组相关)
2017/10/13 Javascript
详解Vue 换肤方案验证
2019/08/28 Javascript
Vue+Element UI 树形控件整合下拉功能菜单(tree + dropdown +input)
2020/08/28 Javascript
解决vue侦听器watch,调用this时出现undefined的问题
2020/10/30 Javascript
[03:10]超级美酒第四天 fy拉比克秀 大合集
2018/06/05 DOTA
Python判断以什么结尾以什么开头的实例
2018/10/27 Python
浅谈Python的list中的选取范围
2018/11/12 Python
Django对接支付宝实现支付宝充值金币功能示例
2019/12/17 Python
python使用ctypes调用扩展模块的实例方法
2020/01/28 Python
python实现读取类别频数数据画水平条形图案例
2020/04/24 Python
基于Python快速处理PDF表格数据
2020/06/03 Python
基于Keras的格式化输出Loss实现方式
2020/06/17 Python
详解H5 活动页之移动端 REM 布局适配方法
2017/12/07 HTML / CSS
canvas生成带二维码海报的踩坑记录
2019/09/11 HTML / CSS
墨西哥运动服饰和鞋网上商店:Netshoes墨西哥
2016/07/28 全球购物
ORACLE十问
2015/04/20 面试题
Linux的主要特性
2014/10/06 面试题
升职自荐信范文
2013/10/05 职场文书
团工委书记自荐书范文
2013/12/17 职场文书
党政领导班子群众路线对照检查材料
2014/10/26 职场文书
2014年教研室工作总结
2014/12/06 职场文书
公务员政审材料
2014/12/23 职场文书
学校捐书活动总结
2015/05/08 职场文书
logback 实现给变量指定默认值
2021/08/30 Java/Android