萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> php編程 >> php處理restful請求的路由類分享

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;         }     } ?>
copyright © 萬盛學電腦網 all rights reserved