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 相关文章推荐
利用ThinkPHP内置的ThinkAjax实现异步传输技术的实现方法
Dec 19 PHP
php笔记之:文章中图片处理的使用
Apr 26 PHP
CodeIgniter图像处理类的深入解析
Jun 17 PHP
使用PHP会话(Session)实现用户登陆功能
Jun 29 PHP
ThinkPHP的截取字符串函数无法显示省略号的解决方法
Jun 25 PHP
PHP循环遍历数组的3种方法list()、each()和while总结
Nov 19 PHP
phpcms手机内容页面添加上一篇和下一篇
Jun 05 PHP
wampserver改变默认网站目录的办法
Aug 05 PHP
PHP共享内存使用与信号控制实例分析
May 09 PHP
Thinkphp5.0 框架Model模型简单用法分析
Oct 11 PHP
php让json_encode不自动转义斜杠“/”的方法
Apr 27 PHP
6个常见的 PHP 安全性攻击实例和阻止方法
Dec 16 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
sony ICF-2010 拆解与改装
2021/03/02 无线电
php 将bmp图片转为jpg等其他任意格式的图片
2009/06/29 PHP
PHP 字符串加密函数(在指定时间内加密还原字符串,超时无法还原)
2010/04/28 PHP
hessian 在PHP中的使用介绍
2010/12/13 PHP
SWFUpload与CI不能正确上传识别文件MIME类型解决方法分享
2011/04/18 PHP
深入PHP中的HashTable结构详解
2013/06/13 PHP
用PHP代替JS玩转DOM的思路及示例代码
2014/06/15 PHP
PHP实现验证码校验功能
2017/11/16 PHP
js中 关于undefined和null的区别介绍
2013/04/16 Javascript
JavaScript中this的使用详解
2013/11/08 Javascript
window.location.href中url中数据量太大时的解决方法
2013/12/23 Javascript
jquery简单实现图片切换效果的方法
2015/05/12 Javascript
移除AngularJS下URL中的#字符的方法
2015/06/19 Javascript
javascript 小数乘法结果错误的处理方法
2016/07/28 Javascript
微信小程序  modal详解及实例代码
2016/11/09 Javascript
js验证手机号、密码、短信验证码代码工具类
2020/06/24 Javascript
JavaScript实现公历转农历功能示例
2017/02/13 Javascript
利用nginx + node在阿里云部署https的步骤详解
2017/12/19 Javascript
JavaScript实现创建自定义对象的常用方式总结
2018/07/09 Javascript
JS基于对象的链表实现与使用方法示例
2019/01/31 Javascript
微信小程序实现首页弹出广告
2020/12/03 Javascript
用Python操作字符串之rindex()方法的使用
2015/05/19 Python
python 随机森林算法及其优化详解
2019/07/11 Python
Django model update的多种用法介绍
2020/03/28 Python
解决python中导入win32com.client出错的问题
2019/07/26 Python
python实现两个文件夹的同步
2019/08/29 Python
CSS3中Color的一些特性介绍
2012/05/27 HTML / CSS
HTML5 FileReader对象的具体使用方法
2020/05/22 HTML / CSS
俄罗斯旅游网站:Tripadvisor俄罗斯
2017/03/21 全球购物
台湾三立电视电商平台:电电购
2019/09/09 全球购物
自荐信格式
2013/12/01 职场文书
工地宣传标语
2014/06/18 职场文书
商场促销活动策划方案
2014/08/18 职场文书
幼儿园六一儿童节活动方案
2014/08/26 职场文书
贷款收入证明格式
2015/06/24 职场文书
Java9新特性对HTTP2协议支持与非阻塞HTTP API
2022/03/16 Java/Android