CakePHP中Router的機制和使用方法
一、典型CakePHP處理 Request 的流程
?? ? ?當人瀏覽網站,發出請求,.htaccess檔案將request映射到webroot/index.php檔案,此檔案中主要處理:1.常量的定義;2.包含bootstrap.php檔案;3.調用 dispather() 函數。
?
二、認識 Router 與 Dispatcher、Controller 之間的關係
?? ? ?(1). 路由(Router)從URL中解釋並提取出這次請求的參數:控制器(controller)、動作(action)以及其他在這次請求中關聯影響到得商務邏輯的所有其他參數資訊;
?? ? ?(2).使用路由後,請求的URL被映射到一個控制器的動作中(在特定的一個控制器類得一個方法)
?? **** 部分函數解析 ****
?? 1. Router::parse($url)
?? ? ? 根據提供的url,解析出對應的controller、action、params 的數組。所依據的準則:預設路由、新定義建立的路由規則。
?
?
?? 2. Router::getArgs($args, $options = array()) 將passed params 轉換為參數
?
三、CakePHP 中Router 配置
?? ? CakePHP 源碼包中 router.php 檔案:
??自訂路由:
connect() 函數的三個參數:1. 你希望匹配的URL值;2. 自訂的路由元素的預設值;3. 協助該路由器匹配的URL元素的正則規則。
基本格式用於Router定義:
?
Router::connect( 'URL', array('paramName' => 'defaultValue'), array('paramName' => 'matchingRegex'));
?
?
??註:
(1) 定義URL類型。URL通常由斜杠分割的,但是也會包含一些萬用字元(*)或者自訂路由元素(URL元素以冒號為首碼),用萬用字元來匹配URL的類型。特殊化的路由元素允許你為你的控制器actions收集參數。
(2) 當請求出現時,這些路由元素的值會在控制器的 $this->params 存在。這不同於具名引數 (named parameter),所以注意區別:具名引數 (/controller/action/name:value) 存在於 $this->passedArgs 中,而自訂路由元素存在於 $this->params 中
?(3) 預設路由:/:controller、 /:controller/:action/*
?
?? ?這樣的配置會返回什麼呢???
?? ?寫兩個例子看一下:
?
四、 CakePHP 中Router 的應用
??(1). 簡單應用:
??(2). 進階應用程式:
?? ? ?SlugRoute的解析方法很簡單。首先我們調用父類parse()函數,可得到解析Regex的路徑。任何空的或false的返回都會導致我們解析路徑失敗(路徑不匹配),只有當我們得到有效路徑(對於post帶有匹配的參數).自從CakeRoute:parse()將已經創造了參數,所以我們不需要修改參數,就返回他們如果沒有目標存在或返回錯誤。
?? ? ?在app/config/routes.php中引用此router類:
?
五、 CakePHP 中Router 設定檔的弊端
?? ? ? CakePHP的預設實現中,我們並不用去設定Route,系統會遵循/controller/action/param的形式去解析URL。但是很多時候這樣的URL並不友好,於是我們就要設定自訂的Route,其結果就是Route設定檔不斷膨脹。值得注意的是PHP對於每個請求都要重建運行環境,而對於一次請求而言,Route設定檔裡最後使用的只是一條配置而已,為了這一條配置,卻不得不重複解析整個龐大的Route設定檔,無疑是個巨大的負擔。
?? ? ? REST風格是解決這個問題的好辦法,採用REST風格的架構方式,資源的URL形式相對確定,操作方式由HTTP方法而定,因此Route設定檔會迅速瘦身。
?? ? ??REST軟體架構是一個抽象的概念,是一種為了實現這一互連網的超媒體分布式系統的行動指南。利用任何的技術都可以實現這種理念。而實現這一軟體架構最著名的就是HTTP協議。通常我們把REST也寫作為REST/HTTP,在實際中往往把REST理解為基於HTTP的REST軟體架構,或者更進一步把REST和HTTP看作為等同的概念。