• 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;
            }
        }
    ?>
  • 相关阅读:
    查找具有特定属性的元素 (XPath-LINQ to XML)
    Docker环境中部署DzzOffice 1.2.5.2
    如何使用DockerHub官方的mysql镜像
    以Tomcat+Mysql为例,实现Docker多容器连接
    基于Ubuntu 14.04构建mysql5.6 Docker镜像
    如何让Docker容器随宿主机的启动而自动启动
    Docker 常用命令
    基于Ubuntu 14.04构建tomcat7镜像
    Dockerfile的书写规则及指令使用方法
    Ubuntu14.04 安装Oracle JDK
  • 原文地址:https://www.cnblogs.com/agang-php/p/5219701.html
Copyright © 2020-2023  润新知