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;
            }
        }
    ?>
  • 相关阅读:
    request.getParameter() 、 request.getInputStream()和request.getReader() 使用体会
    HTTP之Content-Length
    关于spring3中No Session found for current thread!and Transaction的配置和管理(转)
    Java数据类型和MySql数据类型对应一览
    Spring MVC 解读——View,ViewResolver(转)
    LeetCode 441. Arranging Coins
    LeetCode 415. Add Strings
    LeetCode 400. Nth Digit
    LeetCode 367. Valid Perfect Square
    LeetCode 326. Power of Three
  • 原文地址:https://www.cnblogs.com/agang-php/p/5219701.html
Copyright © 2011-2022 走看看