php 建立簡單的Restful WebAPI(二)

來源:互聯網
上載者:User

標籤:style   blog   http   color   io   使用   strong   ar   for   

  先說一下這個項目的代碼結構吧。

  首先是index.php,我是把它作為中央控制器,一個調度器。程式通過rewrite或其他方式,把所有url導向本檔案,由index.php調度其他代碼。

  然後route.php,用設定好的路由規則匹配當前的url,來選擇響應的controller(下面解釋)來處理request,返回response。

  request.php,本檔案用來解析requset資訊(頭部資訊:method,accept,querystring,請求body的資料(主要為json格式)等),儲存到記憶體裡等待其他程式使用。

  response.php,本檔案用來產生response資訊(body資料(json格式),設定狀態代碼,content-type等),返回給用戶端。

  controller檔案夾內的檔案,這些檔案用來處理具體商務邏輯,根據request.php,操作資料庫,使用response.php產生結果返回給用戶端。

  db.php由名字可知,本檔案為資料庫操作類(mysql)。

  還有其他類如日誌功能,身分識別驗證等等以後再實現吧。

  Rewite

  應用程式首先將所有url導向到index.php。可以使用Apache伺服器mod_rewrite重寫轉向(Rewrite)模組來實現。由於我的web服務搭建在新浪SAE,它本身的config.yaml具有url重寫功能,只需要加入一句 - rewrite: if(!is_file()) goto "index.php?%{QUERY_STRING}" 就可以了(config.yaml配置可參閱SAE相關文檔)。

  Route

  首先在router.php配置相關規則:

<?php/** *路由設定檔編寫說明:  *  路由配置在一個array數組中,一條記錄代表一個規則 *  優先匹配索引低的規則 *  key:   只接受2中規則 ‘/{controller}‘和‘/{controller}/{id}‘。{controller}可用字元包括:字母,數字,_ *  value: 第一項controller類名(檔案名稱除去副檔名必須與類名相同); *         第二項id只能為正整數(包含0) *  controller檔案必須位於‘/controller‘檔案夾下;類名必須與檔案名稱相同(除去副檔名.php),區分大小寫。**/$routes= array(    ‘/resources‘ => array(‘resources‘,‘‘),    ‘/resources/id‘ => array(‘resources‘,‘id‘),);?>

  routes數組儲存應用程式的相關規則,由於時間緊迫,設定規則十分不靈活,後期需要加以修改,規則及其解析我們都可以隨時進行調整。routes數組key為需要匹配的url,value為響應的controller名字。前文我們有提到,我們只需要處理2種url :‘/resources‘ => array(‘resources‘,‘‘)表示匹配到/resources時,選擇controller檔案下的resources.php檔案內的resources類來處理。‘/resources/id‘ => array(‘resources‘,‘id‘),大同小異,只不過我們需要,匹配並儲存url中第二層的id。

  然後route.php解析上面的規則:

<?phpclass Route{    private $filepath;      private $classname;        private $id;     private $routepatterns;      public function __construct()    {        $this->filepath      = ‘‘;            $this->classname     = ‘‘;          $this->id            = null;        $this->routepatterns = array();         $this->initRoutes();    }    private function initRoutes()    {        $reg_m1 = ‘#^/(\w+)$#‘;        $reg_m2 = ‘#^/(\w+)/id$#‘;        $matches = array();        $routes = array();        include ‘router.php‘;        foreach($routes as $key=>$value){                          if(preg_match($reg_m1,$key,$matches)){                $this->routepatterns[] = array(‘#^/(‘.$matches[1].‘)\??$#i‘, array(‘controller/‘.$value[0].‘.php‘,$value[0]));            }            else if(preg_match($reg_m2,$key,$matches)){                $this->routepatterns[] = array(‘#^/(‘.$matches[1].‘)/(\d+)\??$#i‘, array(‘controller/‘.$value[0].‘.php‘,$value[0]));            }        }    }    public function processURL($urlpath)    {        $matches = array();        foreach($this->routepatterns as $router){             if(preg_match($router[0],$urlpath,$matches)){                 $filepath_ = ‘/‘.$router[1][0];                 $classname_ = $router[1][1];                 $id_ = count($matches)>2?$matches[2]:null;                 $this->setFilePath($filepath_);                 $this->setClassName($classname_);                 $this->setID($id_);                 return true;             }         }         return false;    }    public function setFilePath($filepath)      {          $this->filepath = $filepath;      }        public function setClassName($classname)      {          $this->classname = $classname;      }        public function setID($id)      {          $this->id = $id;      }        public function getFilePath()      {          return $this->filepath;      }        public function getClassName()      {          return $this->classname;      }        public function getID()      {          return $this->id;      }    }?>

   方法initRoutes()解析了routes所有規則,儲存routepatterns中,等待使用。processURL($urlpath)方法使用解析出的routepatterns匹配傳入url,擷取相應的結果,並記錄下來。

php 建立簡單的Restful WebAPI(二)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.