php处理restful请求的路由类分享

 利用路由表与restful url进行匹配,分发到不同的action处理,最基本的实现,只考虑路由分发功能

 代码如下:
<?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;
        }
    }
?>

时间: 2024-10-30 01:51:09

php处理restful请求的路由类分享的相关文章

php处理restful请求的路由类分享_php实例

复制代码 代码如下: <?php    class Router {        // 路由表        private $routers = array(            array("name"=>"userlist", "pattern"=>"get /user", "action"=>"User#get"),            array(

camel开发restful的时候server类无法获取参数

问题描述 camel开发restful的时候server类无法获取参数 新人正在学习camel-cxf 发布一个restful 服务 get请求的时候没有问题,当提交post请求的时候server类的代码无法获取参数值 解决方案 http://reymont.iteye.com/blog/1523822

一个简单的php路由类_php技巧

本文实例为大家分享了php编写一个简单的路由类,供大家参考,具体内容如下 <?php namespace cmhc\Hcrail; class Hcrail { /** * callback function * @var callable */ protected static $callback; /** * match string or match regexp * @var string */ protected static $match; protected static $rou

php备份数据库类分享

 php备份数据库类分享 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82

PHP中使用Memache作为进程锁的操作类分享

 这篇文章主要介绍了PHP中使用Memache作为进程锁的操作类分享,本文直接给出类实现代码以及应用示例,需要的朋友可以参考下     ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63

PHP中实现获取IP和地理位置类分享

 这篇文章主要介绍了PHP中实现获取IP和地理位置类分享,本文地理定位使用的是SINA的通用接口,需要的朋友可以参考下     发现之前有一个脚本没有写完,简单扩充了一下. 获取IP使用的是经典的逻辑,地理定位使用的是SINA的通用接口. 使用方法详见源码:   代码如下: <?php /* * GET LOCATION BY SINA IP INTERFACE * * @SOULTEARY 2013.04.14 */ classIP { private $args=array(); funct

支持png透明图片的php生成缩略图类分享

 这篇文章主要介绍了支持png透明图片的php生成缩略图类分享,本文代码基于GD2图形库,实现支持png透明图片生成缩略图,需要的朋友可以参考下     注:此功能依赖GD2图形库 最近要用php生成缩略图,在网上找了一下,发现了这篇文章:PHP生成图片缩略图 试用了一下后,发现有这样几个问题: 1.png图片生成的缩略图是jpg格式的 2.png图片生成的缩略图没有了透明(半透明)效果(填充了黑色背景) 3.代码语法比较老 因此,在这个版本的基础上简单修改优化了一下. PHP生成缩略图类 ?

php计算几分钟前、几小时前、几天前的几个函数、类分享

 这篇文章主要介绍了php计算时间几分钟前.几小时前.几天前的几个函数.类分享,需要的朋友可以参考下 一.函数实现 实例1:    代码如下: function time_tran($the_time){    $now_time = date("Y-m-d H:i:s",time()+8*60*60);    $now_time = strtotime($now_time);    $show_time = strtotime($the_time);    $dur = $now_t

导购类分享平台优站正式向第三方导购网站和开发者开放

淘宝网宣布,其导购类分享平台优站正式向第三方导购网站和开发者开放,双方共同推动电商社会化导购服务的发展.并设立规模为5亿美元的基金投资并扶持第三方导购网站等外部合作伙伴. 咋听之下,很多导购网站可能会觉得非常惊讶,认为这是不可能的事实.因为,刚刚过去的一年以来,淘宝方面对导购网站一贯是强硬的态度.不但通过种种措施限制导购网站的发展,而且还进行了部分商品接口封杀,就在今年年初,淘宝联盟明确出政策用返还积分形式替代商家还还现金的形式. 所有政策的执行来自于之前马云内心的恐惧:担心进入淘宝.天猫的"入