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 相关文章推荐
JAVA/JSP学习系列之二
Oct 09 PHP
操作Oracle的php类
Oct 09 PHP
一个没有MYSQL数据库支持的简易留言本的编写
Oct 09 PHP
PHP技术开发技巧分享
Mar 23 PHP
php 函数使用方法与函数定义方法
May 09 PHP
ezSQL PHP数据库操作类库
May 16 PHP
PHP实现多条件查询实例代码
Jul 17 PHP
使用gd库实现php服务端图片裁剪和生成缩略图功能分享
Dec 25 PHP
跟我学Laravel之视图 &amp; Response
Oct 15 PHP
Laravel使用PHPQRCODE实现生成带有LOGO的二维码图片功能示例
Jul 07 PHP
PHP+mysql实现的三级联动菜单功能示例
Feb 15 PHP
Laravel推荐使用的十个辅助函数
May 10 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+dbfile开发小型留言本
2006/10/09 PHP
PHP+MySQL投票系统的设计和实现分享
2012/09/23 PHP
PHP_SELF,SCRIPT_NAME,REQUEST_URI区别
2014/12/24 PHP
php封装的验证码类分享
2017/02/26 PHP
wordpress自定义标签云与随机获取标签的方法详解
2019/03/22 PHP
javascript之更有效率的字符串替换
2008/08/02 Javascript
Javascript基础_简单比较undefined和null 值
2016/06/14 Javascript
js 判断数据类型的几种方法
2017/01/13 Javascript
JavaScript登录记住密码操作(超简单代码)
2017/03/22 Javascript
Angular.js通过自定义指令directive实现滑块滑动效果
2017/10/13 Javascript
不得不知的ES6小技巧
2018/07/28 Javascript
如何使用puppet替换文件中的string
2018/12/06 Javascript
JavaScript键盘事件常见用法实例分析
2019/01/03 Javascript
分享一款超好用的JavaScript 打包压缩工具
2020/04/26 Javascript
[33:28]完美世界DOTA2联赛PWL S3 PXG vs GXR 第三场 12.19
2020/12/24 DOTA
各种Python库安装包下载地址与安装过程详细介绍(Windows版)
2016/11/02 Python
Python实现字典去除重复的方法示例
2017/07/31 Python
Python之web模板应用
2017/12/26 Python
pytorch训练imagenet分类的方法
2018/07/27 Python
python 多个参数不为空校验方法
2019/02/14 Python
详解python selenium 爬取网易云音乐歌单名
2019/03/28 Python
Python: 传递列表副本方式
2019/12/19 Python
python导入库的具体方法
2020/06/18 Python
css3实现背景模糊的三种方式(小结)
2020/05/15 HTML / CSS
飞利浦比利时官方网站:Philips比利时
2016/08/24 全球购物
雅诗兰黛(Estee Lauder)英国官方网站:世界顶级化妆品牌
2016/12/29 全球购物
盖尔斯工厂店:GUESS Factory
2020/01/21 全球购物
商场端午节活动方案
2014/01/29 职场文书
离婚协议书怎么写
2014/09/12 职场文书
2014年宣传部个人工作总结
2014/12/06 职场文书
2015年教师新年寄语
2014/12/08 职场文书
长城导游词400字
2015/01/30 职场文书
2015年三年级班主任工作总结
2015/05/21 职场文书
素质拓展训练感想
2015/08/07 职场文书
修辞手法有哪些?
2019/08/29 职场文书
python实现调用摄像头并拍照发邮箱
2021/04/27 Python