zoukankan      html  css  js  c++  java
  • php处理restful请求的路由(转载 http://www.jb51.net/article/47333.htm)

    <?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;
            }
        }
    ?>
  • 相关阅读:
    javascirpt Scoket
    黑马程序员面试题(一)交通灯管理系统
    中软国际实习总结
    黑马程序员Java基础正则表达式
    黑马程序员Java基础加强Java高新技术
    黑马程序员JAVA基础GUI
    面试题(二)银行业务调度系统
    黑马程序员JAVA基础IO流之File 类
    黑马程序员JAVA基础IO流其他类
    黑马程序员Java基础网络编程
  • 原文地址:https://www.cnblogs.com/agang-php/p/5219701.html
Copyright © 2011-2022 走看看