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
PHP CodeBase:将时间显示为&quot;刚刚&quot;&quot;n分钟/小时前&quot;的方法详解
Jun 06 PHP
php中如何判断一个网页请求是ajax请求还是普通请求
Aug 10 PHP
php解析json数据实例
Aug 19 PHP
PHP判断数据库中的记录是否存在的方法
Nov 14 PHP
PHP中addslashes与mysql_escape_string的区别分析
Apr 25 PHP
yum命令安装php7和相关扩展
Jul 04 PHP
PHP页面跳转操作实例分析(header方法)
Sep 28 PHP
php过滤输入操作之htmlentities与htmlspecialchars用法分析
Feb 17 PHP
PHP实现的激活用户注册验证邮箱功能示例
Jun 06 PHP
PHP实现限制IP访问及提交次数的方法详解
Jul 17 PHP
PHP 8新特性简介
Aug 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
15个小时----从修改程序到自己些程序
2006/10/09 PHP
Windows和Linux中php代码调试工具Xdebug的安装与配置详解
2014/05/08 PHP
php可生成缩略图的文件上传类实例
2014/12/17 PHP
PHP有序表查找之插值查找算法示例
2018/02/10 PHP
yii2 在控制器中验证请求参数的使用方法
2019/06/19 PHP
js 键盘记录实现(兼容FireFox和IE)
2010/02/07 Javascript
javascript下数值型比较难点说明
2010/06/07 Javascript
Jquery 数组操作大全个人总结
2013/11/13 Javascript
window.location.href IE下跳转失效的解决方法
2014/03/27 Javascript
jQuery Ajax使用实例
2015/04/16 Javascript
13个PHP函数超实用
2015/10/21 Javascript
Vuex之理解Getters的用法实例
2017/04/19 Javascript
JavaScript中concat复制数组方法浅析
2019/01/20 Javascript
基于Node.js的大文件分片上传示例
2019/06/19 Javascript
微信小程序开发(三):返回上一级页面并刷新操作示例【页面栈】
2020/06/01 Javascript
python实现360皮肤按钮控件示例
2014/02/21 Python
Python实现截屏的函数
2015/07/25 Python
python3读取csv和xlsx文件的实例
2018/06/22 Python
java中的控制结构(if,循环)详解
2019/06/26 Python
python的命名规则知识点总结
2019/10/04 Python
pygame实现贪吃蛇游戏(上)
2019/10/29 Python
Python面向对象封装操作案例详解 II
2020/01/02 Python
什么是Python中的匿名函数
2020/06/02 Python
python爬虫筛选工作实例讲解
2020/11/23 Python
解决html5中video标签无法播放mp4问题的办法
2017/05/07 HTML / CSS
新奇的小玩意:IWOOT
2016/07/21 全球购物
事业单位个人应聘自荐信
2013/09/21 职场文书
销售职业生涯规划范文
2014/03/14 职场文书
励志演讲稿3分钟
2014/08/21 职场文书
2015年秋季学校开学标语
2015/07/16 职场文书
2016年秋季新学期致辞
2015/07/30 职场文书
Python实现查询剪贴板自动匹配信息的思路详解
2021/07/09 Python
CSS实现九宫格布局(自适应)的示例代码
2022/02/12 HTML / CSS
Python中的 Set 与 dict
2022/03/13 Python
配置nginx负载均衡
2022/05/06 Servers
详解如何使用Nginx解决跨域问题
2022/05/06 Servers