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;
            }
        }
    ?>
  • 相关阅读:
    记第一场省选
    POJ 2083 Fractal 分形
    CodeForces 605A Sorting Railway Cars 思维
    FZU 1896 神奇的魔法数 dp
    FZU 1893 内存管理 模拟
    FZU 1894 志愿者选拔 单调队列
    FZU 1920 Left Mouse Button 简单搜索
    FZU 2086 餐厅点餐
    poj 2299 Ultra-QuickSort 逆序对模版题
    COMP9313 week4a MapReduce
  • 原文地址:https://www.cnblogs.com/agang-php/p/5219701.html
Copyright © 2011-2022 走看看